diff --git a/docker-compose.yaml b/docker-compose.yaml index c53e540..d6136d3 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -111,17 +111,6 @@ services: timeout: 10s retries: 5 - # Documentation Site - docs: - build: ./docs - container_name: docs - hostname: docs - networks: - - fiware_default - ports: - - "3000:80" - restart: unless-stopped - # SUMO Simulation with GUI (choose scenario via environment variable) sumo-simulation: build: diff --git a/src/backend/MIGRATION_SUMMARY.md b/src/backend/MIGRATION_SUMMARY.md deleted file mode 100644 index 68c075f..0000000 --- a/src/backend/MIGRATION_SUMMARY.md +++ /dev/null @@ -1,138 +0,0 @@ - - -# Backend Structure Summary - -## βœ… SUMO RL Integration Complete - -### πŸ“ Final Structure - -``` -src/backend/ -β”œβ”€β”€ app/ -β”‚ β”œβ”€β”€ api/ -β”‚ β”‚ └── routers/ -β”‚ β”‚ └── traffic_light_router.py # FastAPI endpoints -β”‚ β”œβ”€β”€ sumo_rl/ # ⭐ NEW MODULE -β”‚ β”‚ β”œβ”€β”€ agents/ -β”‚ β”‚ β”‚ β”œβ”€β”€ ai_agent.py # AI decision-making -β”‚ β”‚ β”‚ └── iot_agent.py # SUMO control -β”‚ β”‚ β”œβ”€β”€ models/ -β”‚ β”‚ β”‚ β”œβ”€β”€ dqn_model.py # DQN architecture -β”‚ β”‚ β”‚ └── dqn_model.keras # Trained model (334KB) -β”‚ β”‚ β”œβ”€β”€ training/ -β”‚ β”‚ β”‚ └── train_dqn_production.py # Training script -β”‚ β”‚ β”œβ”€β”€ evaluation/ -β”‚ β”‚ β”‚ β”œβ”€β”€ evaluate_dqn.py # Evaluation -β”‚ β”‚ β”‚ └── baseline.py # Baseline comparison -β”‚ β”‚ β”œβ”€β”€ environment/ # SUMO wrappers -β”‚ β”‚ β”œβ”€β”€ sumo_files/ # SUMO scenarios (3 cities) -β”‚ β”‚ β”œβ”€β”€ config.py # Configuration -β”‚ β”‚ └── README.md # Documentation -β”‚ └── main.py # βœ… Updated with SUMO RL router -β”œβ”€β”€ docs/ -β”‚ └── sumo_rl/ # Documentation -β”‚ β”œβ”€β”€ DEMO_GUIDE.md -β”‚ β”œβ”€β”€ FINAL_VERDICT.md -β”‚ β”œβ”€β”€ RESULTS_SUMMARY.md -β”‚ └── evaluation_results_*.png -β”œβ”€β”€ requirements.txt # βœ… Updated with TensorFlow, numpy -└── .env.example # βœ… Updated with SUMO RL config -``` - -### πŸ“Š Statistics - -- **Total Files:** 83 -- **Module Size:** 3.6 MB -- **Python Files:** 10 -- **SUMO Scenarios:** 3 (Nga4ThuDuc, NguyenThaiSon, QuangTrung) -- **Model Size:** 334 KB (25,538 parameters) - -### πŸ—‘οΈ Removed - -- ❌ `SUMO_RL/` folder (root level) β†’ Integrated into backend -- ❌ `SUMO_RL_INTEGRATION.md` β†’ Replaced by `app/sumo_rl/README.md` -- ❌ `app/services/sumo_rl_service.py` β†’ Replaced by agents pattern -- ❌ `__pycache__/` directories β†’ Cleaned -- ❌ Duplicate READMEs in scenario folders - -### βœ… What Was Migrated - -**From SUMO_RL β†’ app/sumo_rl:** - -1. **Core Components:** - - `ai_greenwave_agent.py` β†’ `agents/ai_agent.py` (Flask β†’ FastAPI) - - `iot_agent.py` β†’ `agents/iot_agent.py` - - DQN model β†’ `models/dqn_model.py` + `dqn_model.keras` - -2. **Training & Evaluation:** - - `train_dqn_production.py` β†’ `training/` - - `evaluate_dqn.py` β†’ `evaluation/` - - `baseline.py` β†’ `evaluation/` - -3. **SUMO Files:** - - `sumo_files/` β†’ Complete copy with 3 scenarios - -4. **Documentation:** - - `DEMO_GUIDE.md` β†’ `docs/sumo_rl/` - - `FINAL_VERDICT.md` β†’ `docs/sumo_rl/` - - `RESULTS_SUMMARY.md` β†’ `docs/sumo_rl/` - - `evaluation_results_*.png` β†’ `docs/sumo_rl/` - -### πŸ”§ API Endpoints (Now Available) - -``` -GET /sumo-rl/status # System status -GET /sumo-rl/model-info # Model information -POST /sumo-rl/ai/notify # AI agent notifications -POST /sumo-rl/iot/notify # IoT agent notifications -GET /sumo-rl/proxy/orion/* # Proxy to Orion-LD -``` - -### πŸš€ Ready to Use - -1. **Backend Server:** - ```bash - cd src/backend - uvicorn app.main:app --reload --port 8000 - ``` - -2. **Training (Optional):** - ```bash - cd src/backend - python3 -m app.sumo_rl.training.train_dqn_production - ``` - -3. **Evaluation:** - ```bash - cd src/backend - python3 -m app.sumo_rl.evaluation.evaluate_dqn - ``` - -### πŸ“ Configuration - -Environment variables in `.env`: -```bash -SUMO_RL_ORION_URL=http://localhost:1026/ngsi-ld/v1 -SUMO_RL_TLS_ID=4066470692 -SUMO_RL_NUM_PHASES=2 -SUMO_RL_MODEL_PATH=app/sumo_rl/models/dqn_model.keras -``` - -### 🎯 Performance - -- **DQN Score:** 1383.03 -- **Baseline Score:** 1590.90 -- **Improvement:** 13% better -- **PM2.5 Reduction:** 53% -- **CO2 Reduction:** 48% - ---- - -**Status:** βœ… Production Ready -**Architecture:** Modular, Open Source Ready -**Integration:** Complete (FastAPI + FIWARE + SUMO) diff --git a/src/backend/app/api/routers/sumo_control_router.py.backup b/src/backend/app/api/routers/sumo_control_router.py.backup index a97e20d..9352eb8 100644 --- a/src/backend/app/api/routers/sumo_control_router.py.backup +++ b/src/backend/app/api/routers/sumo_control_router.py.backup @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - """ SUMO Control Router API endpoints để control SUMO simulation vΓ  lαΊ₯y real-time data diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml index ca8099c..7f161ea 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml @@ -1,10 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/src/backend/app/sumo_rl/sumo_files/NguyenThaiSon/e1i_1.xml b/src/backend/app/sumo_rl/sumo_files/NguyenThaiSon/e1i_1.xml index ae809a7..e6463a7 100644 --- a/src/backend/app/sumo_rl/sumo_files/NguyenThaiSon/e1i_1.xml +++ b/src/backend/app/sumo_rl/sumo_files/NguyenThaiSon/e1i_1.xml @@ -1,13 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index fc5af56..5e49a5d 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - [tool.black] line-length = 88 target-version = ['py39'] diff --git a/src/backend/requirements-dev.txt b/src/backend/requirements-dev.txt index f70c94f..40cb797 100644 --- a/src/backend/requirements-dev.txt +++ b/src/backend/requirements-dev.txt @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - fastapi==0.104.1 uvicorn[standard]==0.24.0 httpx==0.25.1 diff --git a/src/backend/requirements.txt b/src/backend/requirements.txt index 9d9f155..f28d4a8 100644 --- a/src/backend/requirements.txt +++ b/src/backend/requirements.txt @@ -1,9 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - - fastapi==0.104.1 uvicorn[standard]==0.24.0 httpx==0.25.1 diff --git a/src/frontend/.dockerignore b/src/frontend/.dockerignore new file mode 100644 index 0000000..117d285 --- /dev/null +++ b/src/frontend/.dockerignore @@ -0,0 +1,6 @@ +node_modules +dist +.git +.env +.DS_Store +coverage diff --git a/src/frontend/nginx.conf b/src/frontend/nginx.conf index 067bc2e..19449bd 100644 --- a/src/frontend/nginx.conf +++ b/src/frontend/nginx.conf @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - server { listen 80; server_name localhost; @@ -18,6 +13,7 @@ server { # SPA routing location / { try_files $uri $uri/ /index.html; + add_header Cache-Control "no-store, no-cache, must-revalidate"; } # Cache static assets diff --git a/src/frontend/src/presentation/components/feature/devices/DeviceWizard.tsx b/src/frontend/src/presentation/components/feature/devices/DeviceWizard.tsx index 46abf37..2bfab99 100644 --- a/src/frontend/src/presentation/components/feature/devices/DeviceWizard.tsx +++ b/src/frontend/src/presentation/components/feature/devices/DeviceWizard.tsx @@ -522,7 +522,7 @@ export const DeviceWizard: React.FC = ({ setDeviceData({ ...deviceData, @@ -549,7 +549,6 @@ export const DeviceWizard: React.FC = ({ setDeviceData({ ...deviceData, httpConfig: { - ipAddress: "", // Default ipAddress if missing ...deviceData.httpConfig, rtspUrl: e.target.value, ipAddress: deviceData.httpConfig?.ipAddress || "", diff --git a/src/frontend/src/presentation/components/feature/landing/HeroSection.tsx b/src/frontend/src/presentation/components/feature/landing/HeroSection.tsx index 0b67752..6ef382d 100644 --- a/src/frontend/src/presentation/components/feature/landing/HeroSection.tsx +++ b/src/frontend/src/presentation/components/feature/landing/HeroSection.tsx @@ -1,33 +1,33 @@ // Copyright (c) 2025 Green Wave Team -// +// // This software is released under the MIT License. // https://opensource.org/licenses/MIT -import React, { useState, useEffect } from "react"; -import { ArrowRight, Github, BookOpen, Car, Zap } from "lucide-react"; -import { useTranslation } from "react-i18next"; -import ParticleBackground from "./ParticleBackground"; -import ThreeDVisualization from "./ThreeDVisualization"; -import LandingImage from "../../../../assets/landing.png"; +import React, { useState, useEffect } from 'react' +import { ArrowRight, Github, BookOpen, Car, Zap } from 'lucide-react' +import { useTranslation } from 'react-i18next' +import ParticleBackground from './ParticleBackground' +import ThreeDVisualization from './ThreeDVisualization' +import LandingImage from '../../../../assets/landing.png' export const HeroSection: React.FC = () => { - const { t } = useTranslation("landing"); - const [scrollY, setScrollY] = useState(0); - const [isHovered, setIsHovered] = useState(false); + const { t } = useTranslation('landing') + const [scrollY, setScrollY] = useState(0) + const [isHovered, setIsHovered] = useState(false) useEffect(() => { - const handleScroll = () => setScrollY(window.scrollY); - window.addEventListener("scroll", handleScroll); - return () => window.removeEventListener("scroll", handleScroll); - }, []); + const handleScroll = () => setScrollY(window.scrollY) + window.addEventListener('scroll', handleScroll) + return () => window.removeEventListener('scroll', handleScroll) + }, []) const handleGetStarted = () => { - window.location.href = "/"; - }; + window.location.href = '/' + } const handleViewGithub = () => { - window.open("https://github.com/sonmessia/GreenWave.git", "_blank"); - }; + window.open('https://github.com/sonmessia/GreenWave.git', '_blank') + } return (
@@ -41,22 +41,21 @@ export const HeroSection: React.FC = () => { style={{ background: `linear-gradient(45deg, var(--color-greenwave-primary-light) 0%, var(--color-traffic-info) 100%)`, transform: `translateY(${scrollY * 0.5}px) scale(1.1)`, - filter: "blur(100px)", + filter: 'blur(100px)', }} />
@@ -67,10 +66,10 @@ export const HeroSection: React.FC = () => {
@@ -83,14 +82,14 @@ export const HeroSection: React.FC = () => { className="w-24 h-24 object-contain mr-2" />

- {t("title")} + {t('title')}

- {t("subtitle")} + {t('subtitle')}

- {t("description")} + {t('description')}

@@ -101,17 +100,17 @@ export const HeroSection: React.FC = () => { className="group relative px-6 py-3 sm:px-8 sm:py-4 rounded-full font-semibold text-base sm:text-lg transition-all duration-300 transform hover:scale-105 whitespace-nowrap" style={{ background: - "linear-gradient(135deg, var(--color-greenwave-primary-light) 0%, var(--color-traffic-info) 100%)", - boxShadow: "0 10px 30px -10px rgba(16, 124, 65, 0.5)", + 'linear-gradient(135deg, var(--color-greenwave-primary-light) 0%, var(--color-traffic-info) 100%)', + boxShadow: '0 10px 30px -10px rgba(16, 124, 65, 0.5)', }} > - {t("getStarted")} + {t('getStarted')}
@@ -119,26 +118,24 @@ export const HeroSection: React.FC = () => { onClick={handleViewGithub} className="px-6 py-3 sm:px-8 sm:py-4 rounded-full font-semibold text-base sm:text-lg border-2 transition-all duration-300 hover:bg-white hover:bg-opacity-10 flex items-center gap-2 whitespace-nowrap" style={{ - borderColor: "rgba(255, 255, 255, 0.2)", - color: "var(--color-text-main-dark)", + borderColor: 'rgba(255, 255, 255, 0.2)', + color: 'var(--color-text-main-dark)', }} > - {t("viewGithub")} + {t('viewGithub')}
@@ -149,7 +146,7 @@ export const HeroSection: React.FC = () => { {/* Pollution Smoke Effect */}
@@ -168,7 +165,7 @@ export const HeroSection: React.FC = () => { {/* GreenWave Team Car (The Hero) */}
@@ -183,7 +180,7 @@ export const HeroSection: React.FC = () => { {/* Background Traffic (Atmosphere) */}
@@ -191,7 +188,7 @@ export const HeroSection: React.FC = () => { {/* Green Wave Effect */}
{isHovered && ( @@ -200,7 +197,7 @@ export const HeroSection: React.FC = () => { className="absolute top-0 left-0 w-full h-full wave-sweep" style={{ background: - "linear-gradient(90deg, transparent 0%, rgba(16, 124, 65, 0.8) 45%, rgba(59, 130, 246, 0.6) 50%, rgba(16, 124, 65, 0.8) 55%, transparent 100%)", + 'linear-gradient(90deg, transparent 0%, rgba(16, 124, 65, 0.8) 45%, rgba(59, 130, 246, 0.6) 50%, rgba(16, 124, 65, 0.8) 55%, transparent 100%)', }} /> )} @@ -211,11 +208,9 @@ export const HeroSection: React.FC = () => { src={LandingImage} alt="GreenWave Traffic System" className={`w-full h-full object-cover rounded-2xl transition-all duration-1000 ${ - isHovered - ? "brightness-110 contrast-125 saturate-130 scale-102" - : "" + isHovered ? 'brightness-110 contrast-125 saturate-130 scale-102' : '' }`} - style={{ filter: "brightness(0.8) contrast(1.1)" }} + style={{ filter: 'brightness(0.8) contrast(1.1)' }} />
@@ -228,5 +223,5 @@ export const HeroSection: React.FC = () => {
- ); -}; + ) +} diff --git a/src/frontend/src/presentation/components/feature/landing/TeamSection.tsx b/src/frontend/src/presentation/components/feature/landing/TeamSection.tsx index e0ebc16..9767953 100644 --- a/src/frontend/src/presentation/components/feature/landing/TeamSection.tsx +++ b/src/frontend/src/presentation/components/feature/landing/TeamSection.tsx @@ -1,40 +1,40 @@ // Copyright (c) 2025 Green Wave Team -// +// // This software is released under the MIT License. // https://opensource.org/licenses/MIT -import React from "react"; -import thaiAnhAI from "../../../../assets/team/thaianh.png"; -import sonCloud from "../../../../assets/team/son.jpg"; -import huynhMinhTri from "../../../../assets/team/tri.jpg"; -import { useTranslation } from "react-i18next"; +import React from 'react' +import thaiAnhAI from '../../../../assets/team/thaianh.png' +import sonCloud from '../../../../assets/team/son.jpg' +import huynhMinhTri from '../../../../assets/team/tri.jpg' +import { useTranslation } from 'react-i18next' export const TeamSection: React.FC = () => { - const { t } = useTranslation("landing"); + const { t } = useTranslation('landing') const teamMembers = [ { - name: "ThΓ‘i Anh 36", - role: t("team.roles.aiData"), + name: 'HoΓ ng ThΓ‘i Anh', + role: t('team.roles.aiData'), imageUrl: thaiAnhAI, }, { - name: "HoΓ ng SΖ‘n", - role: t("team.roles.backend"), + name: 'Nguyα»…n VΓ΅ HoΓ ng SΖ‘n', + role: t('team.roles.backend'), imageUrl: sonCloud, }, { - name: "Huα»³nh Minh TrΓ­", - role: t("team.roles.frontend"), + name: 'Huα»³nh Minh TrΓ­', + role: t('team.roles.frontend'), imageUrl: huynhMinhTri, }, - ]; + ] return (

- {t("team.title")} + {t('team.title')}

@@ -43,27 +43,25 @@ export const TeamSection: React.FC = () => { key={index} className="glass-card p-8 rounded-2xl text-center group" style={{ - background: "rgba(255, 255, 255, 0.03)", - backdropFilter: "blur(10px)", - border: "1px solid rgba(255, 255, 255, 0.1)", + background: 'rgba(255, 255, 255, 0.03)', + backdropFilter: 'blur(10px)', + border: '1px solid rgba(255, 255, 255, 0.1)', }} >
Avatar Member
-

- {member.name} -

+

{member.name}

{member.role}

))}
- ); -}; + ) +} diff --git a/src/frontend/src/presentation/i18n/locales/en.json b/src/frontend/src/presentation/i18n/locales/en.json index 3889a27..782dfdb 100644 --- a/src/frontend/src/presentation/i18n/locales/en.json +++ b/src/frontend/src/presentation/i18n/locales/en.json @@ -164,9 +164,9 @@ "team": { "title": "Development Team", "roles": { - "aiData": "AI & Data Engineer", - "backend": "Backend & Architect", - "frontend": "Frontend & Mascot" + "aiData": "AI Engineer", + "backend": "Backend", + "frontend": "Frontend" } }, "architecture": { diff --git a/src/frontend/src/presentation/i18n/locales/vi.json b/src/frontend/src/presentation/i18n/locales/vi.json index 13c527a..b619bbe 100644 --- a/src/frontend/src/presentation/i18n/locales/vi.json +++ b/src/frontend/src/presentation/i18n/locales/vi.json @@ -164,9 +164,9 @@ "team": { "title": "Đội ngΕ© PhΓ‘t triển", "roles": { - "aiData": "AI & Data Engineer", - "backend": "Backend & Architect", - "frontend": "Frontend & Mascot" + "aiData": "AI Engineer", + "backend": "Backend", + "frontend": "Frontend" } }, "architecture": { diff --git a/src/frontend/tsconfig.app.json b/src/frontend/tsconfig.app.json index 3bb6b3e..2f416e5 100644 --- a/src/frontend/tsconfig.app.json +++ b/src/frontend/tsconfig.app.json @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - { "compilerOptions": { "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", diff --git a/src/frontend/tsconfig.json b/src/frontend/tsconfig.json index 5c1560d..1ffef60 100644 --- a/src/frontend/tsconfig.json +++ b/src/frontend/tsconfig.json @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - { "files": [], "references": [ diff --git a/src/frontend/tsconfig.node.json b/src/frontend/tsconfig.node.json index b34645b..3439137 100644 --- a/src/frontend/tsconfig.node.json +++ b/src/frontend/tsconfig.node.json @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - { "compilerOptions": { "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",