# Konfigurasi untuk Sistem Klasifikasi Jurusan import os import sys def _resource_base_dir(): """Direktori dasar untuk sumber daya read-only yang dibundel.""" if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): return sys._MEIPASS return os.path.dirname(os.path.abspath(__file__)) def _writable_base_dir(): """Direktori dasar untuk file runtime yang dapat ditulis (mis. model terlatih).""" if getattr(sys, 'frozen', False): return os.path.dirname(sys.executable) return os.path.dirname(os.path.abspath(__file__)) RESOURCE_BASE_DIR = _resource_base_dir() WRITABLE_BASE_DIR = _writable_base_dir() def get_resource_path(relative_path): return os.path.join(RESOURCE_BASE_DIR, relative_path) def get_writable_path(relative_path): return os.path.join(WRITABLE_BASE_DIR, relative_path) def get_app_icon_path(): """Tentukan path ikon terbaik untuk aplikasi/jendela jika tersedia.""" candidates = [ get_resource_path(os.path.join('img', 'logo_sekolah.ico')), get_writable_path(os.path.join('img', 'logo_sekolah.ico')), get_resource_path(os.path.join('img', 'Logo_skripsi.ico')), get_writable_path(os.path.join('img', 'Logo_skripsi.ico')), get_writable_path(os.path.join('img', 'logo_sekolah.png')), get_resource_path(os.path.join('img', 'logo_sekolah.png')), get_writable_path(os.path.join('img', 'Logo_skripsi.png')), get_resource_path(os.path.join('img', 'Logo_skripsi.png')), get_writable_path(os.path.join('img', 'logo_sma.ico')), get_resource_path(os.path.join('img', 'logo_sma.ico')), get_writable_path(os.path.join('img', 'logo_sma.png')), get_resource_path(os.path.join('img', 'logo_sma.png')), ] for path in candidates: if os.path.exists(path): return path return '' # Konfigurasi dataset TRAIN_DATASET_PATH = get_resource_path(os.path.join('data', 'dataset_smakom_final_train.csv')) TEST_DATASET_PATH = get_resource_path(os.path.join('data', 'dataset_smakom_final_test.csv')) DATASET_PATH = TRAIN_DATASET_PATH # Path model: dapat ditulis untuk retraining, sebagai fallback saat pertama kali dimuat MODEL_PATH = get_writable_path(os.path.join('models', 'trained_model.pkl')) BUNDLED_MODEL_PATH = get_resource_path(os.path.join('models', 'trained_model.pkl')) # Konfigurasi pelatihan TEST_SIZE = 0.2 # 20% untuk testing, 80% untuk training (300 data: 240 training, 60 testing) RANDOM_STATE = 42 # nomor acak tetap agar hasil random sama # Konfigurasi KNN DEFAULT_K_NEIGHBORS = 27 KNN_WEIGHTS = 'distance' KNN_METRIC = 'euclidean' OPTIMIZE_K = True K_RANGE = range(3, 52, 2) # Kandidat k untuk GridSearchCV pada data ini: 3,5,7,...,51 # Konfigurasi basis data (sudah ada di db/database.py) # Konfigurasi performa CROSS_VALIDATION_FOLDS = 5