From 0db649001e47a3ede1a7dbf42c132b6768378f56 Mon Sep 17 00:00:00 2001 From: Venkatkalyan21 <142110421+Venkatkalyan21@users.noreply.github.com> Date: Mon, 27 Oct 2025 20:03:55 +0530 Subject: [PATCH 1/3] Add *.db to .gitignore to prevent tracking database files --- .gitignore | 3 +++ database/wardha.db | Bin 24576 -> 0 bytes 2 files changed, 3 insertions(+) delete mode 100644 database/wardha.db diff --git a/.gitignore b/.gitignore index 223e02c8..23da1e7f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,9 @@ venv/ # Model files *.pkl +# Database files +*.db + # Python cache __pycache__/ *.pyc diff --git a/database/wardha.db b/database/wardha.db deleted file mode 100644 index b45a2f8e052c02a0b51e31a9202f83fc336bc49f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 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 Date: Mon, 27 Oct 2025 20:08:48 +0530 Subject: [PATCH 2/3] Remove __pycache__ files from Git tracking --- .../models/__pycache__/__init__.cpython-313.pyc | Bin 259 -> 0 bytes .../models/__pycache__/models.cpython-313.pyc | Bin 5641 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 backend/models/__pycache__/__init__.cpython-313.pyc delete mode 100644 backend/models/__pycache__/models.cpython-313.pyc diff --git a/backend/models/__pycache__/__init__.cpython-313.pyc b/backend/models/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 206d2583070a7dd6c78bac6d44f2804e6e7745ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmXv}y-veG4EE((Q9-jKCe|#yEfZp_sx zT)jtXYiy`RQV&RFjW^npov-YEZmCs|_|$4ss^d*n6pd+oQOtHPVRFUIZlkYhcu{b< RGp27Tgg8L@0Vz#5{{o88MkfFO diff --git a/backend/models/__pycache__/models.cpython-313.pyc b/backend/models/__pycache__/models.cpython-313.pyc deleted file mode 100644 index 93b357c3d8c221e674403a58ddbadc39d00dee7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5641 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 LJwH&GHzxdFJ9DK) From 40fb4a1a7d980d3976c26f9800fbb9e5ab4a7b48 Mon Sep 17 00:00:00 2001 From: Venkatkalyan21 <142110421+Venkatkalyan21@users.noreply.github.com> Date: Mon, 27 Oct 2025 20:12:43 +0530 Subject: [PATCH 3/3] Fix database tracking issue: remove from Git, update .gitignore, add setup instructions --- README.md | 10 +++ backend/app.py | 57 ++++++++++++------ .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 267 bytes .../models/__pycache__/models.cpython-313.pyc | Bin 0 -> 5649 bytes 4 files changed, 50 insertions(+), 17 deletions(-) create mode 100644 backend/models/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/models/__pycache__/models.cpython-313.pyc diff --git a/README.md b/README.md index a77cda49..6b349110 100644 --- a/README.md +++ b/README.md @@ -260,6 +260,16 @@ python app.py ``` **Backend will be available at:** `http://localhost:5000` +#### Database Setup +The application uses SQLite for local data storage. The database file is automatically created when you first run the backend server. No manual setup is required. + +**For new contributors:** +1. Ensure you have write permissions in the project directory. +2. Run the backend server (`python app.py`) - this will create `database/wardha.db` automatically. +3. The database contains tables for stations, routes, and passenger logs. + +**Note:** Database files (*.db) are ignored by Git to prevent committing sensitive or large binary data. Each contributor should create their own local database. + #### 3. **Frontend Setup** ```bash # Navigate to frontend directory diff --git a/backend/app.py b/backend/app.py index f6273f98..b26e54c6 100644 --- a/backend/app.py +++ b/backend/app.py @@ -10,7 +10,14 @@ from services import metro_service from flask import request from flask_cors import CORS, cross_origin -from sklearn.ensemble import RandomForestRegressor +try: + from sklearn.ensemble import RandomForestRegressor + SKLEARN_AVAILABLE = True +except Exception: + # scikit-learn may not be installable in some environments (Windows without build tools). + # We'll fall back to a tiny numpy-based DummyRegressor when necessary. + RandomForestRegressor = None + SKLEARN_AVAILABLE = False import numpy as np # Configure logging @@ -49,27 +56,43 @@ logger.error("Error type: %s", type(e).__name__) logger.error("Error message: %s", str(e)) logger.error("Full traceback:\n%s", traceback.format_exc()) - + # Only create dummy model if explicitly enabled via environment variable if USE_DUMMY_MODEL: logger.warning("⚠️ USE_DUMMY_MODEL=true detected. Creating dummy model for development/testing...") logger.warning("⚠️ THIS IS NOT SUITABLE FOR PRODUCTION USE!") - + try: - # Create and train a clearly documented dummy model - # This model generates random predictions and should ONLY be used for testing - np.random.seed(42) - X_dummy = np.random.rand(100, 3) # Features: hour, day_of_week, station_id - y_dummy = np.random.randint(50, 500, 100) # Target: passenger flow (50-500 range) - - model = RandomForestRegressor(n_estimators=10, random_state=42, max_depth=3) - model.fit(X_dummy, y_dummy) - - model_loaded = True - model_type = 'dummy' - logger.warning("⚠️ Dummy model created and trained with synthetic data") - logger.warning("⚠️ Model type: RandomForestRegressor (10 estimators, max_depth=3)") - logger.warning("⚠️ Training data: 100 random samples, passenger flow range: 50-500") + # If scikit-learn is available, create a small RandomForestRegressor for testing + if SKLEARN_AVAILABLE and RandomForestRegressor is not None: + np.random.seed(42) + X_dummy = np.random.rand(100, 3) # Features: hour, day_of_week, station_id + y_dummy = np.random.randint(50, 500, 100) # Target: passenger flow (50-500 range) + + model = RandomForestRegressor(n_estimators=10, random_state=42, max_depth=3) + model.fit(X_dummy, y_dummy) + + model_loaded = True + model_type = 'dummy' + logger.warning("⚠️ Dummy sklearn model created and trained with synthetic data") + else: + # scikit-learn is not available — provide a very small predictable DummyRegressor + class DummyRegressor: + def predict(self, X): + # X may be a pandas DataFrame or array-like — return a simple deterministic value + try: + n = len(X) + except Exception: + n = 1 + # Return a vector of 150 passengers for each input row + return np.full((n,), 150) + + model = DummyRegressor() + model_loaded = True + model_type = 'dummy' + logger.warning("⚠️ Dummy numpy-based model provided (scikit-learn not available)") + + logger.warning("⚠️ Model type: %s", model_type) except Exception as dummy_error: logger.error("❌ Failed to create dummy model: %s", str(dummy_error)) logger.error("Full traceback:\n%s", traceback.format_exc()) diff --git a/backend/models/__pycache__/__init__.cpython-313.pyc b/backend/models/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d720b2a90fe56f73e124a17b7c45e50c96425e2 GIT binary patch literal 267 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 RI(2ltFWvVeg?VGb{{g)ys3ZUY literal 0 HcmV?d00001