{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.18","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"tpu1vmV38","dataSources":[{"sourceId":82611,"databundleVersionId":9553358,"sourceType":"competition"},{"sourceId":12674441,"sourceType":"datasetVersion","datasetId":8009597}],"dockerImageVersionId":31091,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from tqdm import tqdm\nfrom itertools import product\n\nimport numpy as np\nimport pandas as pd\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.model_selection import GroupKFold\nfrom sklearn.impute import SimpleImputer, KNNImputer\nimport warnings\n\nfrom sklearn.linear_model import Ridge\nfrom sklearn.ensemble import StackingRegressor\nwarnings.filterwarnings(\"ignore\")\n\nfrom itertools import product\n\n# hours = range(0, 6, 1)\n# minutes = range(0, 60, 5)\n\n# target_col = \"bg+1-00\"\n# group_col = \"p_num\"\n# date_col = \"time\"\n\n# bg_cols = [f\"bg-{i}-{j:02d}\" for i, j in product(hours, minutes)]\n# insu_cols = [f\"insulin-{i}-{j:02d}\" for i, j in product(hours, minutes)]\n# carb_cols = [f\"carbs-{i}-{j:02d}\" for i, j in product(hours, minutes)]\n# hr_cols = [f\"hr-{i}-{j:02d}\" for i, j in product(hours, minutes)]\n# step_cols = [f\"steps-{i}-{j:02d}\" for i, j in product(hours, minutes)]\n# cals_cols = [f\"cals-{i}-{j:02d}\" for i, j in product(hours, minutes)]\n\n# feature_cols = bg_cols + insu_cols + carb_cols + hr_cols + step_cols + cals_cols\n\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-08-12T02:19:37.668965Z","iopub.execute_input":"2025-08-12T02:19:37.66919Z","iopub.status.idle":"2025-08-12T02:19:45.67221Z","shell.execute_reply.started":"2025-08-12T02:19:37.66916Z","shell.execute_reply":"2025-08-12T02:19:45.666498Z"}},"outputs":[],"execution_count":1},{"cell_type":"code","source":"# df_train = pd.read_csv(\n#     '/kaggle/input/brist1d/train.csv',\n#     index_col='id',\n#     parse_dates=['time'],\n# )\n\n# df_train.columns = df_train.columns.str.replace(':', '-')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T14:23:40.415418Z","iopub.execute_input":"2025-08-11T14:23:40.415837Z","iopub.status.idle":"2025-08-11T14:23:51.212603Z","shell.execute_reply.started":"2025-08-11T14:23:40.415811Z","shell.execute_reply":"2025-08-11T14:23:51.207751Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# import random\n# import os\n# import numpy as np\n# import torch\n\n\n# def seed_everything(seed):\n#     random.seed(seed)\n#     os.environ[\"PYTHONHASHSEED\"] = str(seed)\n#     np.random.seed(seed)\n#     torch.manual_seed(seed)\n#     torch.cuda.manual_seed(seed)\n#     torch.backends.cudnn.deterministic = True\n#     torch.backends.cudnn.benchmark = True\n\n\n# df_train.columns = df_train.columns.str.replace(\":\", \"-\")\n\n\n# for colset in [bg_cols, insu_cols, carb_cols, hr_cols, step_cols, cals_cols]:\n#     df_train[colset] = (\n#         df_train[colset]\n#         .interpolate(axis=1)\n#         .fillna(method=\"bfill\", axis=1)\n#         .fillna(method=\"ffill\", axis=1)\n#     )\n\n# feature_columns = {\n#     'bg': bg_cols,\n#     'hr': hr_cols,\n#     'steps': step_cols\n# }\n\n# def impute_time_series_features(df, columns, method='median', window=5):\n#     for col in columns:\n#         df[col] = df[col].fillna(df[col].rolling(window=window, min_periods=1).median())\n\n#         df[col] = df[col].fillna(method='ffill')\n#         df[col] = df[col].fillna(method='bfill')\n\n#         df[col] = df.groupby('p_num')[col].transform(lambda x: x.fillna(x.median()))\n#     return df\n\n# for feature, columns in feature_columns.items():\n#     df_train = impute_time_series_features(df_train, columns, method='median')\n\n# all_imputed_columns = bg_cols + hr_cols + step_cols\n# print(\"Remaining null values in training set:\", df_train[all_imputed_columns].isnull().sum().sum())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T14:23:51.215278Z","iopub.execute_input":"2025-08-11T14:23:51.215538Z","iopub.status.idle":"2025-08-11T14:24:50.224855Z","shell.execute_reply.started":"2025-08-11T14:23:51.215515Z","shell.execute_reply":"2025-08-11T14:24:50.219028Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# feature_columns_insulin_cals = {\n#     'insulin': insu_cols,\n#     'cals': cals_cols\n# }\n\n# def impute_non_temporal_features(df, columns, method='median', window=5):\n#     for col in columns:\n#         df[col] = df.groupby('p_num')[col].transform(lambda x: x.fillna(x.median()))\n\n#         df[col] = df[col].fillna(df[col].rolling(window=window, min_periods=1).median())\n#     return df\n\n# for feature, columns in feature_columns_insulin_cals.items():\n#     df_train = impute_non_temporal_features(df_train, columns, method='median')\n\n# all_imputed_columns_insulin_cals = insu_cols + cals_cols\n# print(\"Remaining null values in training set:\", df_train[all_imputed_columns_insulin_cals].isnull().sum().sum())\n\n\n\n# feature_columns_insulin_cals = {\n#     'insulin': insu_cols,\n#     'cals': cals_cols\n# }\n\n# def impute_non_temporal_features(df, columns, method='median', window=5):\n#     for col in columns:\n#         df[col] = df.groupby('p_num')[col].transform(lambda x: x.fillna(x.median()))\n\n#         df[col] = df[col].fillna(df[col].rolling(window=window, min_periods=1).median())\n#     return df\n\n# for feature, columns in feature_columns_insulin_cals.items():\n#     df_train = impute_non_temporal_features(df_train, columns, method='median')\n\n# all_imputed_columns_insulin_cals = insu_cols + cals_cols\n# print(\"Remaining null values in training set:\", df_train[all_imputed_columns_insulin_cals].isnull().sum().sum())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T14:24:50.225669Z","iopub.execute_input":"2025-08-11T14:24:50.226059Z","iopub.status.idle":"2025-08-11T14:25:08.781727Z","shell.execute_reply.started":"2025-08-11T14:24:50.226033Z","shell.execute_reply":"2025-08-11T14:25:08.777034Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# activity_cols = [col for col in df_train.columns if col.startswith('activity')]\n# dominant_activity_train = df_train[activity_cols].mode(axis=1)[0]\n# df_train['dominant_activity'] = dominant_activity_train\n# print(df_train['dominant_activity'].value_counts())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T14:25:08.783754Z","iopub.execute_input":"2025-08-11T14:25:08.784088Z","iopub.status.idle":"2025-08-11T14:25:49.515291Z","shell.execute_reply.started":"2025-08-11T14:25:08.784065Z","shell.execute_reply":"2025-08-11T14:25:49.510874Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# activity_replace = {\n#     'Walk': 'Walking',\n#     'Run': 'Running',\n#     'Swim': 'Swimming',\n# }\n# df_train['dominant_activity'] = df_train['dominant_activity'].replace(activity_replace)\n# print(df_train['dominant_activity'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T14:25:49.518495Z","iopub.execute_input":"2025-08-11T14:25:49.518742Z","iopub.status.idle":"2025-08-11T14:25:49.547822Z","shell.execute_reply.started":"2025-08-11T14:25:49.51872Z","shell.execute_reply":"2025-08-11T14:25:49.543424Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# df_train['dominant_activity'].fillna('No Activity', inplace=True)\n\n# from sklearn.preprocessing import LabelEncoder\n\n# label_encoder = LabelEncoder()\n\n# combined_activities = pd.concat([\n#     df_train['dominant_activity']\n# ])\n\n# label_encoder.fit(combined_activities)\n\n# df_train['dominant_activity_encoded'] = label_encoder.transform(df_train['dominant_activity'])\n\n# df_train = df_train.drop(['dominant_activity'], axis = 1)\n\n# feature_cols = feature_cols + ['dominant_activity_encoded']\n\n\n# imputer = SimpleImputer()\n\n# df_train[feature_cols] = imputer.fit_transform(df_train[feature_cols])\n\n# df_train['time_hour'] = pd.to_datetime(df_train['time']).dt.hour\n\n# feature_cols.extend([\"time_hour\"])\n\n# df_train_final = df_train[feature_cols]\n\n# y_target = df_train[[target_col]]\n\n\n# np.isnan(df_train_final).sum()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T14:25:49.550334Z","iopub.execute_input":"2025-08-11T14:25:49.550621Z","iopub.status.idle":"2025-08-11T14:25:53.170964Z","shell.execute_reply.started":"2025-08-11T14:25:49.550581Z","shell.execute_reply":"2025-08-11T14:25:53.166398Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train_final = pd.read_csv('/kaggle/input/datatrain/df_train_final.csv')\ny_target = pd.read_csv('/kaggle/input/datatrain/y_target.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-12T02:19:56.276434Z","iopub.execute_input":"2025-08-12T02:19:56.276745Z","iopub.status.idle":"2025-08-12T02:20:02.959417Z","shell.execute_reply.started":"2025-08-12T02:19:56.276718Z","shell.execute_reply":"2025-08-12T02:20:02.955112Z"}},"outputs":[],"execution_count":2},{"cell_type":"code","source":"!pip install statsmodels","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-12T02:20:05.864338Z","iopub.execute_input":"2025-08-12T02:20:05.864608Z","iopub.status.idle":"2025-08-12T02:20:14.521701Z","shell.execute_reply.started":"2025-08-12T02:20:05.864584Z","shell.execute_reply":"2025-08-12T02:20:14.51702Z"}},"outputs":[{"name":"stdout","text":"Collecting statsmodels\n  Downloading statsmodels-0.14.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (10.7 MB)\n\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m10.7/10.7 MB\u001b[0m \u001b[31m29.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m0:01\u001b[0m\n\u001b[?25hRequirement already satisfied: scipy!=1.9.2,>=1.8 in /usr/local/lib/python3.10/site-packages (from statsmodels) (1.15.3)\nCollecting patsy>=0.5.6\n  Downloading patsy-1.0.1-py2.py3-none-any.whl (232 kB)\n\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m232.9/232.9 kB\u001b[0m \u001b[31m22.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n\u001b[?25hRequirement already satisfied: packaging>=21.3 in /usr/local/lib/python3.10/site-packages (from statsmodels) (25.0)\nRequirement already satisfied: pandas!=2.1.0,>=1.4 in /usr/local/lib/python3.10/site-packages (from statsmodels) (2.3.0)\nRequirement already satisfied: numpy<3,>=1.22.3 in /usr/local/lib/python3.10/site-packages (from statsmodels) (2.0.2)\nRequirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/site-packages (from pandas!=2.1.0,>=1.4->statsmodels) (2.9.0.post0)\nRequirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/site-packages (from pandas!=2.1.0,>=1.4->statsmodels) (2025.2)\nRequirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/site-packages (from pandas!=2.1.0,>=1.4->statsmodels) (2025.2)\nRequirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/site-packages (from python-dateutil>=2.8.2->pandas!=2.1.0,>=1.4->statsmodels) (1.17.0)\nInstalling collected packages: patsy, statsmodels\nSuccessfully installed patsy-1.0.1 statsmodels-0.14.5\n\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n\u001b[0m\n\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.2\u001b[0m\n\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n","output_type":"stream"}],"execution_count":3},{"cell_type":"code","source":"import numpy as np\nimport logging\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport statsmodels.api as sm\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.linear_model import Lasso\nfrom sklearn import linear_model\nfrom statsmodels.stats.multitest import multipletests\nfrom mpmath import mp\nimport time\n\nfrom joblib import delayed, Parallel\nfrom multiprocessing import shared_memory\n\nimport os\n\nmp.dps = 20  # Increased for better tail precision\n\ndef construct_A_XA_Ac_XAc_bhA(X, bh):\n    p = X.shape[1]\n    A = sorted(list(np.where(bh != 0)[0]))\n    XA = X[:, A] if A else np.empty((X.shape[0], 0))\n\n    return A, XA\n\ndef construct_test_statistic(j, XA, y, A):\n    ej = np.zeros((len(A), 1))\n    ej[A.index(j)] = 1\n    inv = np.linalg.pinv(XA.T @ XA)\n    etaj = XA @ inv @ ej\n    etajTy = (etaj.T @ y)[0, 0]\n\n    return etaj, etajTy\n\ndef compute_yz(y, etaj, zk):\n    sq_norm = (etaj.T @ etaj)[0, 0]\n    if sq_norm < 1e-12: sq_norm = 1e-12\n\n    etajTy_scalar = (etaj.T @ y)[0, 0]\n    \n    a = y - etaj * (etajTy_scalar / sq_norm)\n    b = etaj / sq_norm\n    yz = a + b * zk\n   \n    return yz, b\n\ndef compute_polyhedron(X, M, s, lambda_val):\n    n, p = X.shape\n    if not M: return np.empty((0, n)), np.empty(0)\n    \n    X_M = X[:, M]\n    X_notM_indices = np.setdiff1d(np.arange(p), M)\n    X_notM = X[:, X_notM_indices]\n    \n    try:\n        XATXA_inv = np.linalg.pinv(X_M.T @ X_M)\n    except np.linalg.LinAlgError:\n        return np.empty((0, n)), np.empty(0)\n\n    A0, b0 = np.empty((0, n)), np.empty(0)\n    if X_notM.shape[1] > 0:\n        term_k_x_k = X_notM.T @ X_M @ XATXA_inv\n        X_notM_T_P_M = term_k_x_k @ X_M.T\n        \n        A0_T = (1/lambda_val) * (X_notM.T - X_notM_T_P_M)\n        \n        A0 = np.vstack([A0_T, -A0_T])\n        \n        XT_M_pinv = np.linalg.pinv(X_M.T)\n        s_term = X_notM.T @ XT_M_pinv @ s\n        b0 = np.hstack([np.ones(X_notM.shape[1]) - s_term, \n                        np.ones(X_notM.shape[1]) + s_term])\n    \n    A1 = -np.diag(s) @ XATXA_inv @ X_M.T\n    b1 = -lambda_val * np.diag(s) @ XATXA_inv @ s\n    \n    return np.vstack([A0, A1]), np.hstack([b0, b1])\n\ndef compute_truncation_bounds(A, b, eta, y):\n    eta = eta.ravel()\n    y = y.ravel()\n    eta_norm = np.dot(eta, eta)\n    if eta_norm < 1e-10:\n        raise ValueError(\"eta has near-zero norm\")\n    c = eta / eta_norm\n    z = y - np.dot(eta, y) * c\n    Ac = A @ c\n    Az = A @ z\n    V_minus = None\n    V_plus = None\n    V_zero = np.inf\n    for j in range(A.shape[0]):\n        if abs(Ac[j]) == 0:\n            V_zero = min(V_zero, b[j] - Az[j])\n        elif Ac[j] < 0:\n            if V_minus is None or (b[j] - Az[j]) / Ac[j] > V_minus:\n                V_minus = (b[j] - Az[j]) / Ac[j]\n        elif Ac[j] > 0:\n            if V_plus is None or (b[j] - Az[j]) / Ac[j] < V_plus:\n                V_plus = (b[j] - Az[j]) / Ac[j]\n    if V_minus is None:\n        V_minus = -np.inf\n    if V_plus is None:\n        V_plus = np.inf\n    if V_zero < 0:\n        raise ValueError(\"Invalid truncation bounds: V_zero < 0\")\n\n    return V_minus, V_plus\n\ndef create_shared_array(arr: np.ndarray):\n    shm = shared_memory.SharedMemory(create=True, size=arr.nbytes)\n    shm_arr = np.ndarray(arr.shape, dtype=arr.dtype, buffer=shm.buf)\n    shm_arr[:] = arr[:]\n    return shm, arr.shape, arr.dtype.str\n\ndef attach_shared_array(shm_name, shape, dtype_str):\n    shm = shared_memory.SharedMemory(name=shm_name)\n    arr = np.ndarray(shape, dtype=np.dtype(dtype_str), buffer=shm.buf)\n    return shm, arr\n\ndef setup_worker_logging(worker_id):\n    logger = logging.getLogger(f\"worker_{worker_id}\")\n    logger.setLevel(logging.INFO)\n    handler = logging.StreamHandler()\n    formatter = logging.Formatter('%(asctime)s - PID:%(process)d - %(name)s - %(levelname)s - %(message)s')\n    handler.setFormatter(formatter)\n    if not logger.handlers:\n        logger.addHandler(handler)\n    return logger\n\ndef process_segment(z_start, z_end,\n                    X_shm_name, X_shape, X_dtype,\n                    y_shm_name, y_shape, y_dtype,\n                    etaj_shm_name, etaj_shape, etaj_dtype,\n                    alpha, sigma_sq, small_eps=0.001, max_iter=2000,\n                    lasso_tol=1e-4, lasso_max_iter=20000):\n    \n    worker_id = os.getpid()\n    logger = setup_worker_logging(worker_id)\n    logger.info(f\"BẮT ĐẦU xử lý đoạn [{z_start:.4f}, {z_end:.4f}]\")\n    \n    start_time = time.time()\n\n    shmX, X = attach_shared_array(X_shm_name, X_shape, X_dtype)\n    shmy, y = attach_shared_array(y_shm_name, y_shape, y_dtype)\n    shmetaj, etaj = attach_shared_array(etaj_shm_name, etaj_shape, etaj_dtype)\n\n    n = X.shape[0]\n    results = []\n    clf = Lasso(alpha=alpha / n, fit_intercept=False, tol=lasso_tol, warm_start=True, max_iter=lasso_max_iter)\n\n    zk = float(z_start)\n    it = 0\n    log_interval = 20\n\n    while zk < z_end and it < max_iter:\n        it += 1\n        \n        if it == 1 or it % log_interval == 0:\n            logger.info(f\"Vòng lặp #{it}... zk hiện tại = {zk:.6f}\")\n\n        yz, b_vec = compute_yz(y, etaj, zk)\n        yz_flat = yz.flatten()\n        \n        clf.fit(X, yz_flat)\n       \n        bhz = clf.coef_.copy()\n\n        A, _ = construct_A_XA_Ac_XAc_bhA(X, bhz)\n\n        if len(A) == 0:\n            V_l, V_r = zk, z_end\n        else:\n            s = np.sign(bhz[A])\n            A1, b1 = compute_polyhedron(X, A, s, alpha)\n            try:\n                V_l, V_r = compute_truncation_bounds(A1, b1, etaj, yz_flat)\n            except Exception as e:\n                logger.error(f\"Lỗi tại vòng lặp {it}, zk={zk:.4f}: {e}. Dùng bước nhảy nhỏ.\")\n                V_l, V_r = zk, zk + small_eps\n\n        # Fix for inf V_r\n        if not np.isfinite(V_r):\n            if V_r == np.inf:\n                zk = z_end\n            else:\n                zk = zk + small_eps\n        else:\n            if V_r <= zk + 1e-12:\n                zk = zk + small_eps\n            else:\n                zk = min(V_r + small_eps, z_end)\n\n        results.append((zk, A, bhz))\n\n    shmX.close()\n    shmy.close()\n    shmetaj.close()\n    \n    end_time = time.time()\n    duration = end_time - start_time\n    \n    if it >= max_iter:\n        logger.warning(f\"ĐÃ ĐẠT GIỚI HẠN {max_iter} vòng lặp. Worker có thể chưa xử lý xong.\")\n\n    logger.info(f\"KẾT THÚC xử lý đoạn [{z_start:.4f}, {z_end:.4f}]. Tổng cộng: {it} vòng lặp. Thời gian: {duration:.2f} giây.\")\n\n    return results\n\ndef run_parametric_lasso(X, y, alpha, etaj, threshold, sigma_sq,\n                         n_segments=5, overlap=0.01, **worker_kwargs):\n    shmX, X_shape, X_dtype = create_shared_array(X)\n    shmy, y_shape, y_dtype = create_shared_array(y.reshape(-1,1))\n    shmetaj, etaj_shape, etaj_dtype = create_shared_array(etaj)\n\n    edges = np.linspace(-threshold, threshold, n_segments + 1)\n    segments = []\n    for i in range(n_segments):\n        z0 = edges[i] - (overlap if i > 0 else 0.0)\n        z1 = edges[i+1] + (overlap if i < n_segments - 1 else 0.0)\n        z0 = max(z0, -threshold)\n        z1 = min(z1, threshold)\n        segments.append((z0, z1))\n\n    parallel = Parallel(n_jobs=n_segments)\n    jobs = (delayed(process_segment)(\n                z0, z1,\n                shmX.name, X_shape, X_dtype,\n                shmy.name, y_shape, y_dtype,\n                shmetaj.name, etaj_shape, etaj_dtype,\n                alpha, sigma_sq,\n                **worker_kwargs\n            ) for (z0, z1) in segments)\n    segment_results = parallel(jobs)\n\n    shmX.close(); shmX.unlink()\n    shmy.close(); shmy.unlink()\n    shmetaj.close(); shmetaj.unlink()\n\n    all_entries = []\n    for seg in segment_results:\n        all_entries.extend(seg)\n    all_entries.sort(key=lambda t: t[0])\n\n    merged_zk = []\n    merged_active_sets = []\n    merged_bhz = []\n    tol = 1e-8\n    for zk, A, bhz in all_entries:\n        if merged_zk and abs(zk - merged_zk[-1]) < tol:\n            continue\n        merged_zk.append(float(zk))\n        merged_active_sets.append(A)\n        merged_bhz.append(bhz)\n\n    if len(merged_zk) == 0 or merged_zk[-1] < threshold - 1e-12:\n        merged_zk.append(float(threshold))\n\n    return merged_zk, merged_active_sets, merged_bhz\n\ndef p_value(A_obs, list_active_set, list_zk, list_bhz, etaj, z_obs, cov_matrix, observed_s):\n    tn_sigma = np.sqrt((etaj.T @ cov_matrix @ etaj))[0, 0]\n    if tn_sigma < 1e-9: return None\n    \n    z_intervals = []\n    for i, active_set in enumerate(list_active_set):\n        bhz_i = list_bhz[i]\n        s_i = np.sign(bhz_i[active_set]) if len(active_set) > 0 else np.array([])\n        if set(A_obs) == set(active_set) and np.all(s_i == observed_s):\n            z_intervals.append([list_zk[i], list_zk[i+1]])\n\n    if not z_intervals: return None\n\n    tn_mu = 0\n    numerator = mp.mpf(0)\n    denominator = mp.mpf(0)\n    \n    for al, ar in z_intervals:\n        prob_interval = mp.ncdf((ar - tn_mu)/tn_sigma) - mp.ncdf((al - tn_mu)/tn_sigma)\n        denominator += prob_interval\n        if z_obs >= ar:\n            numerator += prob_interval\n        elif z_obs > al:\n            numerator += mp.ncdf((z_obs - tn_mu)/tn_sigma) - mp.ncdf((al - tn_mu)/tn_sigma)\n            \n    if denominator < 1e-100:\n        # Fix for extreme tail: set p to 0 if mass is numerically zero (strong significance)\n        return 0.0\n    \n    pivot_val = float(numerator / denominator)\n    print(\"Done7\")\n    return 2 * min(pivot_val, 1 - pivot_val)\n\n# Main\n\nif __name__ == '__main__':\n    # Your original main code here, with df_train_final and y_target\n    # The fixes above should resolve the N/A issue for strong features\n    pass\n# Main\n\nif __name__ == '__main__':\n    # Assume df_train_final and y_target defined somewhere\n    print(\"Sử dụng dữ liệu X_clean và y_clean...\")\n   \n    X_clean = df_train_final\n    y_clean = np.asarray(y_target).flatten()  # Sửa: Chuyển thành numpy array 1D để tránh vấn đề với DataFrame/Series\n    \n    print(f\"Dữ liệu đầu vào: X_clean.shape={X_clean.shape}, y_clean.shape={y_clean.shape}\")\n\n    print(\"\\n--- Giai đoạn 1: Lựa chọn Mô hình bằng Lasso ---\")\n\n    scaler = StandardScaler()\n    X_columns = X_clean.columns\n    X_scaled = scaler.fit_transform(X_clean)\n    n, p = X_scaled.shape\n    BEST_ALPHA = 6000\n    print(f\"Sử dụng alpha cố định: {BEST_ALPHA:.4f}\")\n    lasso_model = Lasso(alpha=BEST_ALPHA/n).fit(X_scaled, y_clean)\n    A_obs, XA_obs = construct_A_XA_Ac_XAc_bhA(X_scaled, lasso_model.coef_)\n\n    if not A_obs:\n        print(\"Lasso không chọn đặc trưng nào. Kết thúc.\")\n        exit()\n\n    print(f\"\\nLasso đã chọn {len(A_obs)} đặc trưng.\")\n    print(\"Các đặc trưng được chọn:\", X_columns[A_obs].tolist())\n\n    # Sửa: Ước lượng sigma^2 từ OLS trên active set\n    XA = X_scaled[:, A_obs]\n    if len(A_obs) >= n:\n        raise ValueError(\"Active set quá lớn, không thể ước lượng sigma^2.\")\n    beta_ols, _, _, _ = np.linalg.lstsq(XA, y_clean, rcond=None)\n    y_pred_ols = XA @ beta_ols\n    residuals = y_clean - y_pred_ols\n    df_residuals = n - len(A_obs)\n    sigma_squared_hat = np.sum(residuals**2) / df_residuals\n    print(f\"Ước lượng phương sai nhiễu (σ^2): {sigma_squared_hat:.4f}\")\n\n    print(f\"\\n--- Giai đoạn 2: Bắt đầu Suy luận Chọn lọc cho {len(A_obs)} đặc trưng ---\")\n    p_values_dict = {}\n    \n    y_col_vector = y_clean.reshape(-1, 1)\n    observed_s = np.sign(lasso_model.coef_[A_obs])\n\n    for i, j_selected in enumerate(A_obs):\n        feature_name = X_columns[j_selected]\n        start_time = time.time()\n        print(f\"  [{i+1}/{len(A_obs)}] Đang phân tích '{feature_name}'...\")\n        etaj, etajTy_orig = construct_test_statistic(j_selected, XA_obs, y_col_vector, A_obs)\n        sq_norm_eta = (etaj.T @ etaj)[0, 0]\n        if sq_norm_eta < 1e-12: sq_norm_eta = 1e-12\n        \n        etajTy_scalar = (etaj.T @ y_col_vector)[0, 0]\n        a_vec = y_col_vector - etaj * (etajTy_scalar / sq_norm_eta)\n        z_obs = etajTy_orig      \n        sigma_z = np.sqrt(sq_norm_eta * sigma_squared_hat)\n        threshold = 20\n\n        n_segments = os.cpu_count()\n        \n        list_zk, list_active_set, list_bhz = run_parametric_lasso(\n            X_scaled, y_col_vector, BEST_ALPHA, etaj,\n            threshold=threshold, sigma_sq=sigma_squared_hat,\n            n_segments=n_segments,\n            small_eps=0.001, max_iter=2000\n        )\n    \n        cov_matrix = np.identity(n) * sigma_squared_hat\n    \n        p_val = p_value(A_obs, list_active_set, list_zk, list_bhz, etaj, z_obs, cov_matrix, observed_s)\n        \n        \n        p_values_dict[feature_name] = p_val\n        elapsed_time = time.time() - start_time\n        print(f\"    -> p-value = {p_val if p_val is not None else 'N/A'} (Thời gian: {elapsed_time:.2f}s)\")\n        break\n        \n    print(\"\\n--- Giai đoạn 3: Phân tích Kết quả Cuối cùng ---\")\n    results_df = pd.DataFrame.from_dict(p_values_dict, orient='index', columns=['raw_p_value']).dropna()\n    results_df.index.name = 'feature'\n    results_df.sort_values('raw_p_value', inplace=True)\n\n    if not results_df.empty:\n        reject, p_adjusted, _, _ = multipletests(results_df['raw_p_value'], alpha=0.05, method='fdr_bh')\n        results_df['adjusted_p_value'] = p_adjusted\n        results_df['is_significant'] = reject\n        \n        lasso_coef_df = pd.DataFrame({\n            'feature': X_columns[A_obs],\n            'lasso_coefficient': lasso_model.coef_[A_obs]\n        })\n        results_df = pd.merge(results_df, lasso_coef_df, left_index=True, right_on='feature').set_index('feature')\n        results_df = results_df.sort_values('adjusted_p_value')\n\n        print(\"\\nBảng kết quả Suy luận Chọn lọc:\")\n        print(results_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-12T02:21:31.170038Z","iopub.execute_input":"2025-08-12T02:21:31.170464Z","iopub.status.idle":"2025-08-12T02:53:45.90152Z","shell.execute_reply.started":"2025-08-12T02:21:31.170427Z","shell.execute_reply":"2025-08-12T02:53:45.892516Z"}},"outputs":[{"name":"stdout","text":"Sử dụng dữ liệu X_clean và y_clean...\nDữ liệu đầu vào: X_clean.shape=(107377, 433), y_clean.shape=(107377,)\n\n--- Giai đoạn 1: Lựa chọn Mô hình bằng Lasso ---\nSử dụng alpha cố định: 6000.0000\n\nLasso đã chọn 27 đặc trưng.\nCác đặc trưng được chọn: ['bg-0-00', 'bg-0-20', 'bg-0-25', 'bg-4-55', 'bg-5-10', 'bg-5-25', 'bg-5-50', 'bg-5-55', 'insulin-0-30', 'insulin-0-35', 'carbs-2-10', 'carbs-2-15', 'carbs-2-20', 'carbs-2-25', 'steps-0-20', 'steps-0-25', 'steps-0-30', 'steps-0-40', 'cals-0-00', 'cals-0-05', 'cals-0-10', 'cals-0-25', 'cals-0-40', 'cals-0-45', 'cals-0-55', 'cals-1-00', 'cals-2-00']\nƯớc lượng phương sai nhiễu (σ^2): 76.7352\n\n--- Giai đoạn 2: Bắt đầu Suy luận Chọn lọc cho 27 đặc trưng ---\n  [1/27] Đang phân tích 'bg-0-00'...\n","output_type":"stream"},{"name":"stderr","text":"2025-08-12 02:21:39,615 - PID:504 - worker_504 - INFO - BẮT ĐẦU xử lý đoạn [-19.1767, -18.7400]\n2025-08-12 02:21:39,617 - PID:504 - worker_504 - INFO - Vòng lặp #1... zk hiện tại = -19.176667\n2025-08-12 02:21:39,768 - PID:498 - worker_498 - INFO - BẮT ĐẦU xử lý đoạn [-18.7600, -18.3233]\n2025-08-12 02:21:39,769 - PID:498 - worker_498 - INFO - Vòng lặp #1... zk hiện tại = -18.760000\n2025-08-12 02:21:39,796 - PID:500 - worker_500 - INFO - BẮT ĐẦU xử lý đoạn [-20.0000, -19.5733]\n2025-08-12 02:21:39,797 - PID:500 - worker_500 - INFO - Vòng lặp #1... zk hiện tại = -20.000000\n2025-08-12 02:21:39,838 - PID:509 - worker_509 - INFO - BẮT ĐẦU xử lý đoạn [-16.2600, -15.8233]\n2025-08-12 02:21:39,840 - PID:509 - worker_509 - INFO - Vòng lặp #1... zk hiện tại = -16.260000\n2025-08-12 02:21:39,863 - PID:499 - worker_499 - INFO - BẮT ĐẦU xử lý đoạn [-17.9267, -17.4900]\n2025-08-12 02:21:39,864 - PID:499 - worker_499 - INFO - Vòng lặp #1... zk hiện tại = -17.926667\n2025-08-12 02:21:39,869 - PID:510 - worker_510 - INFO - BẮT ĐẦU xử lý đoạn [-15.8433, -15.4067]\n2025-08-12 02:21:39,870 - PID:510 - worker_510 - INFO - Vòng lặp #1... zk hiện tại = -15.843333\n2025-08-12 02:21:39,883 - PID:505 - worker_505 - INFO - BẮT ĐẦU xử lý đoạn [-18.3433, -17.9067]\n2025-08-12 02:21:39,884 - PID:505 - worker_505 - INFO - Vòng lặp #1... zk hiện tại = -18.343333\n2025-08-12 02:21:39,907 - PID:506 - worker_506 - INFO - BẮT ĐẦU xử lý đoạn [-17.5100, -17.0733]\n2025-08-12 02:21:39,909 - PID:506 - worker_506 - INFO - Vòng lặp #1... zk hiện tại = -17.510000\n2025-08-12 02:21:39,928 - PID:501 - worker_501 - INFO - BẮT ĐẦU xử lý đoạn [-19.5933, -19.1567]\n2025-08-12 02:21:39,929 - PID:501 - worker_501 - INFO - Vòng lặp #1... zk hiện tại = -19.593333\n2025-08-12 02:21:39,937 - PID:508 - worker_508 - INFO - BẮT ĐẦU xử lý đoạn [-17.0933, -16.6567]\n2025-08-12 02:21:39,938 - PID:508 - worker_508 - INFO - Vòng lặp #1... zk hiện tại = -17.093333\n2025-08-12 02:21:39,968 - PID:515 - worker_515 - INFO - BẮT ĐẦU xử lý đoạn [-13.3433, -12.9067]\n2025-08-12 02:21:39,969 - PID:515 - worker_515 - INFO - Vòng lặp #1... zk hiện tại = -13.343333\n2025-08-12 02:21:39,984 - PID:513 - worker_513 - INFO - BẮT ĐẦU xử lý đoạn [-14.5933, -14.1567]\n2025-08-12 02:21:39,985 - PID:513 - worker_513 - INFO - Vòng lặp #1... zk hiện tại = -14.593333\n2025-08-12 02:21:40,054 - PID:517 - worker_517 - INFO - BẮT ĐẦU xử lý đoạn [-12.5100, -12.0733]\n2025-08-12 02:21:40,055 - PID:517 - worker_517 - INFO - Vòng lặp #1... zk hiện tại = -12.510000\n2025-08-12 02:21:40,055 - PID:512 - worker_512 - INFO - BẮT ĐẦU xử lý đoạn [-15.0100, -14.5733]\n2025-08-12 02:21:40,056 - PID:512 - worker_512 - INFO - Vòng lặp #1... zk hiện tại = -15.010000\n2025-08-12 02:21:40,056 - PID:502 - worker_502 - INFO - BẮT ĐẦU xử lý đoạn [-13.7600, -13.3233]\n2025-08-12 02:21:40,057 - PID:502 - worker_502 - INFO - Vòng lặp #1... zk hiện tại = -13.760000\n2025-08-12 02:21:40,060 - PID:585 - worker_585 - INFO - BẮT ĐẦU xử lý đoạn [-11.2600, -10.8233]\n2025-08-12 02:21:40,060 - PID:514 - worker_514 - INFO - BẮT ĐẦU xử lý đoạn [-14.1767, -13.7400]\n2025-08-12 02:21:40,060 - PID:518 - worker_518 - INFO - BẮT ĐẦU xử lý đoạn [-11.6767, -11.2400]\n2025-08-12 02:21:40,060 - PID:518 - worker_518 - INFO - Vòng lặp #1... zk hiện tại = -11.676667\n2025-08-12 02:21:40,060 - PID:514 - worker_514 - INFO - Vòng lặp #1... zk hiện tại = -14.176667\n2025-08-12 02:21:40,061 - PID:585 - worker_585 - INFO - Vòng lặp #1... zk hiện tại = -11.260000\n2025-08-12 02:21:40,087 - PID:503 - worker_503 - INFO - BẮT ĐẦU xử lý đoạn [-16.6767, -16.2400]\n2025-08-12 02:21:40,088 - PID:503 - worker_503 - INFO - Vòng lặp #1... zk hiện tại = -16.676667\n2025-08-12 02:21:40,097 - PID:516 - worker_516 - INFO - BẮT ĐẦU xử lý đoạn [-12.9267, -12.4900]\n2025-08-12 02:21:40,098 - PID:516 - worker_516 - INFO - Vòng lặp #1... zk hiện tại = -12.926667\n2025-08-12 02:21:40,132 - PID:586 - worker_586 - INFO - BẮT ĐẦU xử lý đoạn [-10.8433, -10.4067]\n2025-08-12 02:21:40,133 - PID:586 - worker_586 - INFO - Vòng lặp #1... zk hiện tại = -10.843333\n2025-08-12 02:21:40,145 - PID:511 - worker_511 - INFO - BẮT ĐẦU xử lý đoạn [-15.4267, -14.9900]\n2025-08-12 02:21:40,146 - PID:511 - worker_511 - INFO - Vòng lặp #1... zk hiện tại = -15.426667\n2025-08-12 02:21:40,160 - PID:507 - worker_507 - INFO - BẮT ĐẦU xử lý đoạn [-12.0933, -11.6567]\n2025-08-12 02:21:40,162 - PID:507 - worker_507 - INFO - Vòng lặp #1... zk hiện tại = -12.093333\n2025-08-12 02:21:40,162 - PID:587 - worker_587 - INFO - BẮT ĐẦU xử lý đoạn [-10.4267, -9.9900]\n2025-08-12 02:21:40,163 - PID:587 - worker_587 - INFO - Vòng lặp #1... zk hiện tại = -10.426667\n2025-08-12 02:21:40,183 - PID:583 - worker_583 - INFO - BẮT ĐẦU xử lý đoạn [-9.1767, -8.7400]\n2025-08-12 02:21:40,185 - PID:583 - worker_583 - INFO - Vòng lặp #1... zk hiện tại = -9.176667\n2025-08-12 02:21:40,188 - PID:590 - worker_590 - INFO - BẮT ĐẦU xử lý đoạn [-5.4267, -4.9900]\n2025-08-12 02:21:40,188 - PID:590 - worker_590 - INFO - Vòng lặp #1... zk hiện tại = -5.426667\n2025-08-12 02:21:40,195 - PID:588 - worker_588 - INFO - BẮT ĐẦU xử lý đoạn [-8.3433, -7.9067]\n2025-08-12 02:21:40,200 - PID:588 - worker_588 - INFO - Vòng lặp #1... zk hiện tại = -8.343333\n2025-08-12 02:21:40,222 - PID:584 - worker_584 - INFO - BẮT ĐẦU xử lý đoạn [-8.7600, -8.3233]\n2025-08-12 02:21:40,223 - PID:584 - worker_584 - INFO - Vòng lặp #1... zk hiện tại = -8.760000\n2025-08-12 02:21:40,235 - PID:519 - worker_519 - INFO - BẮT ĐẦU xử lý đoạn [-10.0100, -9.5733]\n2025-08-12 02:21:40,241 - PID:519 - worker_519 - INFO - Vòng lặp #1... zk hiện tại = -10.010000\n2025-08-12 02:21:40,252 - PID:600 - worker_600 - INFO - BẮT ĐẦU xử lý đoạn [-4.1767, -3.7400]\n2025-08-12 02:21:40,252 - PID:592 - worker_592 - INFO - BẮT ĐẦU xử lý đoạn [-7.9267, -7.4900]\n2025-08-12 02:21:40,252 - PID:592 - worker_592 - INFO - Vòng lặp #1... zk hiện tại = -7.926667\n2025-08-12 02:21:40,253 - PID:600 - worker_600 - INFO - Vòng lặp #1... zk hiện tại = -4.176667\n2025-08-12 02:21:40,257 - PID:593 - worker_593 - INFO - BẮT ĐẦU xử lý đoạn [-6.6767, -6.2400]\n2025-08-12 02:21:40,257 - PID:593 - worker_593 - INFO - Vòng lặp #1... zk hiện tại = -6.676667\n2025-08-12 02:21:40,263 - PID:599 - worker_599 - INFO - BẮT ĐẦU xử lý đoạn [-4.5933, -4.1567]\n2025-08-12 02:21:40,268 - PID:599 - worker_599 - INFO - Vòng lặp #1... zk hiện tại = -4.593333\n2025-08-12 02:21:40,280 - PID:596 - worker_596 - INFO - BẮT ĐẦU xử lý đoạn [-5.8433, -5.4067]\n2025-08-12 02:21:40,287 - PID:596 - worker_596 - INFO - Vòng lặp #1... zk hiện tại = -5.843333\n2025-08-12 02:21:40,309 - PID:604 - worker_604 - INFO - BẮT ĐẦU xử lý đoạn [-2.9267, -2.4900]\n2025-08-12 02:21:40,311 - PID:604 - worker_604 - INFO - Vòng lặp #1... zk hiện tại = -2.926667\n2025-08-12 02:21:40,329 - PID:611 - worker_611 - INFO - BẮT ĐẦU xử lý đoạn [0.8233, 1.2600]\n2025-08-12 02:21:40,334 - PID:611 - worker_611 - INFO - Vòng lặp #1... zk hiện tại = 0.823333\n2025-08-12 02:21:40,336 - PID:602 - worker_602 - INFO - BẮT ĐẦU xử lý đoạn [-3.3433, -2.9067]\n2025-08-12 02:21:40,336 - PID:621 - worker_621 - INFO - BẮT ĐẦU xử lý đoạn [4.9900, 5.4267]\n2025-08-12 02:21:40,337 - PID:602 - worker_602 - INFO - Vòng lặp #1... zk hiện tại = -3.343333\n2025-08-12 02:21:40,337 - PID:621 - worker_621 - INFO - Vòng lặp #1... zk hiện tại = 4.990000\n2025-08-12 02:21:40,337 - PID:591 - worker_591 - INFO - BẮT ĐẦU xử lý đoạn [-7.0933, -6.6567]\n2025-08-12 02:21:40,338 - PID:591 - worker_591 - INFO - Vòng lặp #1... zk hiện tại = -7.093333\n2025-08-12 02:21:40,341 - PID:598 - worker_598 - INFO - BẮT ĐẦU xử lý đoạn [-1.2600, -0.8233]\n2025-08-12 02:21:40,342 - PID:598 - worker_598 - INFO - Vòng lặp #1... zk hiện tại = -1.260000\n2025-08-12 02:21:40,344 - PID:589 - worker_589 - INFO - BẮT ĐẦU xử lý đoạn [-9.5933, -9.1567]\n2025-08-12 02:21:40,345 - PID:589 - worker_589 - INFO - Vòng lặp #1... zk hiện tại = -9.593333\n2025-08-12 02:21:40,345 - PID:597 - worker_597 - INFO - BẮT ĐẦU xử lý đoạn [-5.0100, -4.5733]\n2025-08-12 02:21:40,346 - PID:609 - worker_609 - INFO - BẮT ĐẦU xử lý đoạn [0.4067, 0.8433]\n2025-08-12 02:21:40,347 - PID:597 - worker_597 - INFO - Vòng lặp #1... zk hiện tại = -5.010000\n2025-08-12 02:21:40,347 - PID:609 - worker_609 - INFO - Vòng lặp #1... zk hiện tại = 0.406667\n2025-08-12 02:21:40,348 - PID:619 - worker_619 - INFO - BẮT ĐẦU xử lý đoạn [3.7400, 4.1767]\n2025-08-12 02:21:40,348 - PID:595 - worker_595 - INFO - BẮT ĐẦU xử lý đoạn [-6.2600, -5.8233]\n2025-08-12 02:21:40,349 - PID:595 - worker_595 - INFO - Vòng lặp #1... zk hiện tại = -6.260000\n2025-08-12 02:21:40,349 - PID:619 - worker_619 - INFO - Vòng lặp #1... zk hiện tại = 3.740000\n2025-08-12 02:21:40,364 - PID:607 - worker_607 - INFO - BẮT ĐẦU xử lý đoạn [-1.6767, -1.2400]\n2025-08-12 02:21:40,365 - PID:607 - worker_607 - INFO - Vòng lặp #1... zk hiện tại = -1.676667\n2025-08-12 02:21:40,381 - PID:610 - worker_610 - INFO - BẮT ĐẦU xử lý đoạn [-0.4267, 0.0100]\n2025-08-12 02:21:40,382 - PID:610 - worker_610 - INFO - Vòng lặp #1... zk hiện tại = -0.426667\n2025-08-12 02:21:40,394 - PID:601 - worker_601 - INFO - BẮT ĐẦU xử lý đoạn [-3.7600, -3.3233]\n2025-08-12 02:21:40,395 - PID:601 - worker_601 - INFO - Vòng lặp #1... zk hiện tại = -3.760000\n2025-08-12 02:21:40,396 - PID:617 - worker_617 - INFO - BẮT ĐẦU xử lý đoạn [2.9067, 3.3433]\n2025-08-12 02:21:40,398 - PID:617 - worker_617 - INFO - Vòng lặp #1... zk hiện tại = 2.906667\n2025-08-12 02:21:40,404 - PID:614 - worker_614 - INFO - BẮT ĐẦU xử lý đoạn [2.0733, 2.5100]\n2025-08-12 02:21:40,409 - PID:614 - worker_614 - INFO - Vòng lặp #1... zk hiện tại = 2.073333\n2025-08-12 02:21:40,415 - PID:603 - worker_603 - INFO - BẮT ĐẦU xử lý đoạn [-2.5100, -2.0733]\n2025-08-12 02:21:40,416 - PID:603 - worker_603 - INFO - Vòng lặp #1... zk hiện tại = -2.510000\n2025-08-12 02:21:40,418 - PID:594 - worker_594 - INFO - BẮT ĐẦU xử lý đoạn [-7.5100, -7.0733]\n2025-08-12 02:21:40,420 - PID:594 - worker_594 - INFO - Vòng lặp #1... zk hiện tại = -7.510000\n2025-08-12 02:21:40,425 - PID:606 - worker_606 - INFO - BẮT ĐẦU xử lý đoạn [-0.8433, -0.4067]\n2025-08-12 02:21:40,427 - PID:606 - worker_606 - INFO - Vòng lặp #1... zk hiện tại = -0.843333\n2025-08-12 02:21:40,445 - PID:622 - worker_622 - INFO - BẮT ĐẦU xử lý đoạn [4.5733, 5.0100]\n2025-08-12 02:21:40,447 - PID:622 - worker_622 - INFO - Vòng lặp #1... zk hiện tại = 4.573333\n2025-08-12 02:21:40,448 - PID:608 - worker_608 - INFO - BẮT ĐẦU xử lý đoạn [-0.0100, 0.4267]\n2025-08-12 02:21:40,448 - PID:629 - worker_629 - INFO - BẮT ĐẦU xử lý đoạn [7.9067, 8.3433]\n2025-08-12 02:21:40,449 - PID:608 - worker_608 - INFO - Vòng lặp #1... zk hiện tại = -0.010000\n2025-08-12 02:21:40,449 - PID:629 - worker_629 - INFO - Vòng lặp #1... zk hiện tại = 7.906667\n2025-08-12 02:21:40,461 - PID:638 - worker_638 - INFO - BẮT ĐẦU xử lý đoạn [12.0733, 12.5100]\n2025-08-12 02:21:40,462 - PID:638 - worker_638 - INFO - Vòng lặp #1... zk hiện tại = 12.073333\n2025-08-12 02:21:40,472 - PID:605 - worker_605 - INFO - BẮT ĐẦU xử lý đoạn [-2.0933, -1.6567]\n2025-08-12 02:21:40,473 - PID:605 - worker_605 - INFO - Vòng lặp #1... zk hiện tại = -2.093333\n2025-08-12 02:21:40,477 - PID:612 - worker_612 - INFO - BẮT ĐẦU xử lý đoạn [1.2400, 1.6767]\n2025-08-12 02:21:40,478 - PID:612 - worker_612 - INFO - Vòng lặp #1... zk hiện tại = 1.240000\n2025-08-12 02:21:40,479 - PID:632 - worker_632 - INFO - BẮT ĐẦU xử lý đoạn [9.5733, 10.0100]\n2025-08-12 02:21:40,480 - PID:632 - worker_632 - INFO - Vòng lặp #1... zk hiện tại = 9.573333\n2025-08-12 02:21:40,480 - PID:634 - worker_634 - INFO - BẮT ĐẦU xử lý đoạn [10.4067, 10.8433]\n2025-08-12 02:21:40,481 - PID:634 - worker_634 - INFO - Vòng lặp #1... zk hiện tại = 10.406667\n2025-08-12 02:21:40,489 - PID:641 - worker_641 - INFO - BẮT ĐẦU xử lý đoạn [13.3233, 13.7600]\n2025-08-12 02:21:40,490 - PID:641 - worker_641 - INFO - Vòng lặp #1... zk hiện tại = 13.323333\n2025-08-12 02:21:40,491 - PID:633 - worker_633 - INFO - BẮT ĐẦU xử lý đoạn [9.9900, 10.4267]\n2025-08-12 02:21:40,492 - PID:633 - worker_633 - INFO - Vòng lặp #1... zk hiện tại = 9.990000\n2025-08-12 02:21:40,503 - PID:630 - worker_630 - INFO - BẮT ĐẦU xử lý đoạn [7.4900, 7.9267]\n2025-08-12 02:21:40,505 - PID:630 - worker_630 - INFO - Vòng lặp #1... zk hiện tại = 7.490000\n2025-08-12 02:21:40,507 - PID:640 - worker_640 - INFO - BẮT ĐẦU xử lý đoạn [12.4900, 12.9267]\n2025-08-12 02:21:40,507 - PID:618 - worker_618 - INFO - BẮT ĐẦU xử lý đoạn [3.3233, 3.7600]\n2025-08-12 02:21:40,508 - PID:640 - worker_640 - INFO - Vòng lặp #1... zk hiện tại = 12.490000\n2025-08-12 02:21:40,508 - PID:618 - worker_618 - INFO - Vòng lặp #1... zk hiện tại = 3.323333\n2025-08-12 02:21:40,514 - PID:616 - worker_616 - INFO - BẮT ĐẦU xử lý đoạn [2.4900, 2.9267]\n2025-08-12 02:21:40,516 - PID:616 - worker_616 - INFO - Vòng lặp #1... zk hiện tại = 2.490000\n2025-08-12 02:21:40,518 - PID:623 - worker_623 - INFO - BẮT ĐẦU xử lý đoạn [5.4067, 5.8433]\n2025-08-12 02:21:40,519 - PID:623 - worker_623 - INFO - Vòng lặp #1... zk hiện tại = 5.406667\n2025-08-12 02:21:40,528 - PID:628 - worker_628 - INFO - BẮT ĐẦU xử lý đoạn [8.7400, 9.1767]\n2025-08-12 02:21:40,531 - PID:628 - worker_628 - INFO - Vòng lặp #1... zk hiện tại = 8.740000\n2025-08-12 02:21:40,536 - PID:615 - worker_615 - INFO - BẮT ĐẦU xử lý đoạn [7.0733, 7.5100]\n2025-08-12 02:21:40,537 - PID:615 - worker_615 - INFO - Vòng lặp #1... zk hiện tại = 7.073333\n2025-08-12 02:21:40,551 - PID:635 - worker_635 - INFO - BẮT ĐẦU xử lý đoạn [10.8233, 11.2600]\n2025-08-12 02:21:40,552 - PID:635 - worker_635 - INFO - Vòng lặp #1... zk hiện tại = 10.823333\n2025-08-12 02:21:40,552 - PID:624 - worker_624 - INFO - BẮT ĐẦU xử lý đoạn [5.8233, 6.2600]\n2025-08-12 02:21:40,553 - PID:624 - worker_624 - INFO - Vòng lặp #1... zk hiện tại = 5.823333\n2025-08-12 02:21:40,569 - PID:627 - worker_627 - INFO - BẮT ĐẦU xử lý đoạn [8.3233, 8.7600]\n2025-08-12 02:21:40,571 - PID:627 - worker_627 - INFO - Vòng lặp #1... zk hiện tại = 8.323333\n2025-08-12 02:21:40,583 - PID:636 - worker_636 - INFO - BẮT ĐẦU xử lý đoạn [11.2400, 11.6767]\n2025-08-12 02:21:40,585 - PID:636 - worker_636 - INFO - Vòng lặp #1... zk hiện tại = 11.240000\n2025-08-12 02:21:40,587 - PID:639 - worker_639 - INFO - BẮT ĐẦU xử lý đoạn [12.9067, 13.3433]\n2025-08-12 02:21:40,588 - PID:639 - worker_639 - INFO - Vòng lặp #1... zk hiện tại = 12.906667\n2025-08-12 02:21:40,616 - PID:613 - worker_613 - INFO - BẮT ĐẦU xử lý đoạn [1.6567, 2.0933]\n2025-08-12 02:21:40,616 - PID:620 - worker_620 - INFO - BẮT ĐẦU xử lý đoạn [4.1567, 4.5933]\n2025-08-12 02:21:40,617 - PID:613 - worker_613 - INFO - Vòng lặp #1... zk hiện tại = 1.656667\n2025-08-12 02:21:40,617 - PID:620 - worker_620 - INFO - Vòng lặp #1... zk hiện tại = 4.156667\n2025-08-12 02:21:40,639 - PID:625 - worker_625 - INFO - BẮT ĐẦU xử lý đoạn [6.2400, 6.6767]\n2025-08-12 02:21:40,640 - PID:625 - worker_625 - INFO - Vòng lặp #1... zk hiện tại = 6.240000\n2025-08-12 02:21:40,657 - PID:631 - worker_631 - INFO - BẮT ĐẦU xử lý đoạn [9.1567, 9.5933]\n2025-08-12 02:21:40,658 - PID:631 - worker_631 - INFO - Vòng lặp #1... zk hiện tại = 9.156667\n2025-08-12 02:21:40,699 - PID:637 - worker_637 - INFO - BẮT ĐẦU xử lý đoạn [11.6567, 12.0933]\n2025-08-12 02:21:40,701 - PID:637 - worker_637 - INFO - Vòng lặp #1... zk hiện tại = 11.656667\n2025-08-12 02:21:40,728 - PID:644 - worker_644 - INFO - BẮT ĐẦU xử lý đoạn [14.5733, 15.0100]\n2025-08-12 02:21:40,729 - PID:644 - worker_644 - INFO - Vòng lặp #1... zk hiện tại = 14.573333\n2025-08-12 02:21:40,744 - PID:650 - worker_650 - INFO - BẮT ĐẦU xử lý đoạn [16.2400, 16.6767]\n2025-08-12 02:21:40,746 - PID:650 - worker_650 - INFO - Vòng lặp #1... zk hiện tại = 16.240000\n2025-08-12 02:21:40,748 - PID:655 - worker_655 - INFO - BẮT ĐẦU xử lý đoạn [19.5733, 20.0000]\n2025-08-12 02:21:40,749 - PID:655 - worker_655 - INFO - Vòng lặp #1... zk hiện tại = 19.573333\n2025-08-12 02:21:40,763 - PID:647 - worker_647 - INFO - BẮT ĐẦU xử lý đoạn [15.4067, 15.8433]\n2025-08-12 02:21:40,765 - PID:647 - worker_647 - INFO - Vòng lặp #1... zk hiện tại = 15.406667\n2025-08-12 02:21:40,769 - PID:626 - worker_626 - INFO - BẮT ĐẦU xử lý đoạn [6.6567, 7.0933]\n2025-08-12 02:21:40,770 - PID:626 - worker_626 - INFO - Vòng lặp #1... zk hiện tại = 6.656667\n2025-08-12 02:21:40,793 - PID:646 - worker_646 - INFO - BẮT ĐẦU xử lý đoạn [15.8233, 16.2600]\n2025-08-12 02:21:40,795 - PID:646 - worker_646 - INFO - Vòng lặp #1... zk hiện tại = 15.823333\n2025-08-12 02:21:40,799 - PID:652 - worker_652 - INFO - BẮT ĐẦU xử lý đoạn [17.0733, 17.5100]\n2025-08-12 02:21:40,800 - PID:652 - worker_652 - INFO - Vòng lặp #1... zk hiện tại = 17.073333\n2025-08-12 02:21:40,823 - PID:649 - worker_649 - INFO - BẮT ĐẦU xử lý đoạn [16.6567, 17.0933]\n2025-08-12 02:21:40,824 - PID:649 - worker_649 - INFO - Vòng lặp #1... zk hiện tại = 16.656667\n2025-08-12 02:21:40,848 - PID:642 - worker_642 - INFO - BẮT ĐẦU xử lý đoạn [13.7400, 14.1767]\n2025-08-12 02:21:40,850 - PID:642 - worker_642 - INFO - Vòng lặp #1... zk hiện tại = 13.740000\n2025-08-12 02:21:40,853 - PID:651 - worker_651 - INFO - BẮT ĐẦU xử lý đoạn [17.4900, 17.9267]\n2025-08-12 02:21:40,854 - PID:651 - worker_651 - INFO - Vòng lặp #1... zk hiện tại = 17.490000\n2025-08-12 02:21:40,901 - PID:645 - worker_645 - INFO - BẮT ĐẦU xử lý đoạn [14.9900, 15.4267]\n2025-08-12 02:21:40,903 - PID:645 - worker_645 - INFO - Vòng lặp #1... zk hiện tại = 14.990000\n2025-08-12 02:21:40,964 - PID:643 - worker_643 - INFO - BẮT ĐẦU xử lý đoạn [14.1567, 14.5933]\n2025-08-12 02:21:40,966 - PID:643 - worker_643 - INFO - Vòng lặp #1... zk hiện tại = 14.156667\n2025-08-12 02:21:40,969 - PID:648 - worker_648 - INFO - BẮT ĐẦU xử lý đoạn [18.3233, 18.7600]\n2025-08-12 02:21:40,970 - PID:648 - worker_648 - INFO - Vòng lặp #1... zk hiện tại = 18.323333\n2025-08-12 02:21:41,119 - PID:656 - worker_656 - INFO - BẮT ĐẦU xử lý đoạn [19.1567, 19.5933]\n2025-08-12 02:21:41,121 - PID:656 - worker_656 - INFO - Vòng lặp #1... zk hiện tại = 19.156667\n2025-08-12 02:21:41,131 - PID:654 - worker_654 - INFO - BẮT ĐẦU xử lý đoạn [17.9067, 18.3433]\n2025-08-12 02:21:41,141 - PID:654 - worker_654 - INFO - Vòng lặp #1... zk hiện tại = 17.906667\n2025-08-12 02:21:41,186 - PID:653 - worker_653 - INFO - BẮT ĐẦU xử lý đoạn [18.7400, 19.1767]\n2025-08-12 02:21:41,188 - PID:653 - worker_653 - INFO - Vòng lặp #1... zk hiện tại = 18.740000\n2025-08-12 02:23:50,854 - PID:607 - worker_607 - INFO - KẾT THÚC xử lý đoạn [-1.6767, -1.2400]. Tổng cộng: 2 vòng lặp. Thời gian: 130.49 giây.\n2025-08-12 02:23:55,794 - PID:637 - worker_637 - INFO - KẾT THÚC xử lý đoạn [11.6567, 12.0933]. Tổng cộng: 1 vòng lặp. Thời gian: 135.09 giây.\n2025-08-12 02:24:00,141 - PID:636 - worker_636 - INFO - KẾT THÚC xử lý đoạn [11.2400, 11.6767]. Tổng cộng: 1 vòng lặp. Thời gian: 139.56 giây.\n2025-08-12 02:24:10,440 - PID:604 - worker_604 - INFO - KẾT THÚC xử lý đoạn [-2.9267, -2.4900]. Tổng cộng: 2 vòng lặp. Thời gian: 150.13 giây.\n2025-08-12 02:24:35,055 - PID:597 - worker_597 - INFO - KẾT THÚC xử lý đoạn [-5.0100, -4.5733]. Tổng cộng: 1 vòng lặp. Thời gian: 174.71 giây.\n2025-08-12 02:24:40,523 - PID:605 - worker_605 - INFO - KẾT THÚC xử lý đoạn [-2.0933, -1.6567]. Tổng cộng: 4 vòng lặp. Thời gian: 180.05 giây.\n2025-08-12 02:24:50,988 - PID:640 - worker_640 - INFO - KẾT THÚC xử lý đoạn [12.4900, 12.9267]. Tổng cộng: 1 vòng lặp. Thời gian: 190.48 giây.\n2025-08-12 02:25:27,312 - PID:642 - worker_642 - INFO - KẾT THÚC xử lý đoạn [13.7400, 14.1767]. Tổng cộng: 1 vòng lặp. Thời gian: 226.46 giây.\n2025-08-12 02:25:31,736 - PID:590 - worker_590 - INFO - KẾT THÚC xử lý đoạn [-5.4267, -4.9900]. Tổng cộng: 1 vòng lặp. Thời gian: 231.55 giây.\n2025-08-12 02:25:52,257 - PID:591 - worker_591 - INFO - KẾT THÚC xử lý đoạn [-7.0933, -6.6567]. Tổng cộng: 1 vòng lặp. Thời gian: 251.92 giây.\n2025-08-12 02:25:54,912 - PID:585 - worker_585 - INFO - KẾT THÚC xử lý đoạn [-11.2600, -10.8233]. Tổng cộng: 1 vòng lặp. Thời gian: 254.85 giây.\n2025-08-12 02:25:55,674 - PID:644 - worker_644 - INFO - KẾT THÚC xử lý đoạn [14.5733, 15.0100]. Tổng cộng: 1 vòng lặp. Thời gian: 254.95 giây.\n2025-08-12 02:25:56,764 - PID:645 - worker_645 - INFO - KẾT THÚC xử lý đoạn [14.9900, 15.4267]. Tổng cộng: 1 vòng lặp. Thời gian: 255.86 giây.\n2025-08-12 02:26:05,442 - PID:518 - worker_518 - INFO - KẾT THÚC xử lý đoạn [-11.6767, -11.2400]. Tổng cộng: 1 vòng lặp. Thời gian: 265.38 giây.\n2025-08-12 02:26:07,192 - PID:643 - worker_643 - INFO - KẾT THÚC xử lý đoạn [14.1567, 14.5933]. Tổng cộng: 2 vòng lặp. Thời gian: 266.23 giây.\n2025-08-12 02:26:14,555 - PID:587 - worker_587 - INFO - KẾT THÚC xử lý đoạn [-10.4267, -9.9900]. Tổng cộng: 1 vòng lặp. Thời gian: 274.39 giây.\n2025-08-12 02:26:17,408 - PID:519 - worker_519 - INFO - KẾT THÚC xử lý đoạn [-10.0100, -9.5733]. Tổng cộng: 1 vòng lặp. Thời gian: 277.17 giây.\n2025-08-12 02:26:24,390 - PID:586 - worker_586 - INFO - KẾT THÚC xử lý đoạn [-10.8433, -10.4067]. Tổng cộng: 1 vòng lặp. Thời gian: 284.26 giây.\n2025-08-12 02:26:38,926 - PID:655 - worker_655 - INFO - KẾT THÚC xử lý đoạn [19.5733, 20.0000]. Tổng cộng: 1 vòng lặp. Thời gian: 298.18 giây.\n2025-08-12 02:26:47,214 - PID:638 - worker_638 - INFO - KẾT THÚC xử lý đoạn [12.0733, 12.5100]. Tổng cộng: 6 vòng lặp. Thời gian: 306.75 giây.\n2025-08-12 02:26:53,707 - PID:656 - worker_656 - INFO - KẾT THÚC xử lý đoạn [19.1567, 19.5933]. Tổng cộng: 1 vòng lặp. Thời gian: 312.59 giây.\n2025-08-12 02:26:58,814 - PID:507 - worker_507 - INFO - KẾT THÚC xử lý đoạn [-12.0933, -11.6567]. Tổng cộng: 1 vòng lặp. Thời gian: 318.65 giây.\n2025-08-12 02:27:10,848 - PID:624 - worker_624 - INFO - Vòng lặp #20... zk hiện tại = 5.842333\n2025-08-12 02:27:12,689 - PID:516 - worker_516 - INFO - KẾT THÚC xử lý đoạn [-12.9267, -12.4900]. Tổng cộng: 1 vòng lặp. Thời gian: 332.59 giây.\n2025-08-12 02:27:15,264 - PID:627 - worker_627 - INFO - Vòng lặp #20... zk hiện tại = 8.342333\n2025-08-12 02:27:15,835 - PID:515 - worker_515 - INFO - KẾT THÚC xử lý đoạn [-13.3433, -12.9067]. Tổng cộng: 1 vòng lặp. Thời gian: 335.87 giây.\n2025-08-12 02:27:17,948 - PID:513 - worker_513 - INFO - KẾT THÚC xử lý đoạn [-14.5933, -14.1567]. Tổng cộng: 1 vòng lặp. Thời gian: 337.96 giây.\n2025-08-12 02:27:18,036 - PID:629 - worker_629 - INFO - Vòng lặp #20... zk hiện tại = 7.925667\n2025-08-12 02:27:18,461 - PID:517 - worker_517 - INFO - KẾT THÚC xử lý đoạn [-12.5100, -12.0733]. Tổng cộng: 1 vòng lặp. Thời gian: 338.41 giây.\n2025-08-12 02:27:23,661 - PID:631 - worker_631 - INFO - Vòng lặp #20... zk hiện tại = 9.175667\n2025-08-12 02:27:24,845 - PID:632 - worker_632 - INFO - Vòng lặp #20... zk hiện tại = 9.592333\n2025-08-12 02:27:31,298 - PID:613 - worker_613 - INFO - Vòng lặp #20... zk hiện tại = 1.675667\n2025-08-12 02:27:32,224 - PID:630 - worker_630 - INFO - Vòng lặp #20... zk hiện tại = 7.509000\n2025-08-12 02:27:33,249 - PID:654 - worker_654 - INFO - KẾT THÚC xử lý đoạn [17.9067, 18.3433]. Tổng cộng: 1 vòng lặp. Thời gian: 352.11 giây.\n2025-08-12 02:27:35,911 - PID:615 - worker_615 - INFO - Vòng lặp #20... zk hiện tại = 7.092333\n2025-08-12 02:27:39,586 - PID:626 - worker_626 - INFO - Vòng lặp #20... zk hiện tại = 6.675667\n2025-08-12 02:27:40,156 - PID:614 - worker_614 - INFO - Vòng lặp #20... zk hiện tại = 2.092333\n2025-08-12 02:27:41,530 - PID:617 - worker_617 - INFO - Vòng lặp #20... zk hiện tại = 2.925667\n2025-08-12 02:27:43,005 - PID:616 - worker_616 - INFO - Vòng lặp #20... zk hiện tại = 2.516324\n2025-08-12 02:27:45,306 - PID:602 - worker_602 - INFO - Vòng lặp #20... zk hiện tại = -3.246914\n2025-08-12 02:27:50,625 - PID:499 - worker_499 - INFO - KẾT THÚC xử lý đoạn [-17.9267, -17.4900]. Tổng cộng: 1 vòng lặp. Thời gian: 370.76 giây.\n2025-08-12 02:27:50,748 - PID:608 - worker_608 - INFO - KẾT THÚC xử lý đoạn [-0.0100, 0.4267]. Tổng cộng: 8 vòng lặp. Thời gian: 370.30 giây.\n2025-08-12 02:27:51,304 - PID:653 - worker_653 - INFO - KẾT THÚC xử lý đoạn [18.7400, 19.1767]. Tổng cộng: 1 vòng lặp. Thời gian: 370.12 giây.\n2025-08-12 02:27:52,004 - PID:649 - worker_649 - INFO - KẾT THÚC xử lý đoạn [16.6567, 17.0933]. Tổng cộng: 2 vòng lặp. Thời gian: 371.18 giây.\n2025-08-12 02:27:55,742 - PID:619 - worker_619 - INFO - Vòng lặp #20... zk hiện tại = 3.759000\n2025-08-12 02:27:58,395 - PID:633 - worker_633 - INFO - Vòng lặp #20... zk hiện tại = 10.085061\n2025-08-12 02:27:58,846 - PID:639 - worker_639 - INFO - KẾT THÚC xử lý đoạn [12.9067, 13.3433]. Tổng cộng: 4 vòng lặp. Thời gian: 378.26 giây.\n2025-08-12 02:28:03,375 - PID:628 - worker_628 - INFO - Vòng lặp #20... zk hiện tại = 9.054544\n2025-08-12 02:28:05,173 - PID:635 - worker_635 - INFO - Vòng lặp #20... zk hiện tại = 10.878737\n2025-08-12 02:28:07,275 - PID:600 - worker_600 - INFO - Vòng lặp #20... zk hiện tại = -4.157667\n2025-08-12 02:28:07,990 - PID:625 - worker_625 - INFO - Vòng lặp #20... zk hiện tại = 6.259000\n2025-08-12 02:28:15,728 - PID:612 - worker_612 - INFO - Vòng lặp #20... zk hiện tại = 1.408136\n2025-08-12 02:28:16,930 - PID:634 - worker_634 - INFO - Vòng lặp #20... zk hiện tại = 10.425667\n2025-08-12 02:28:18,152 - PID:623 - worker_623 - INFO - Vòng lặp #20... zk hiện tại = 5.425667\n2025-08-12 02:28:18,659 - PID:510 - worker_510 - INFO - KẾT THÚC xử lý đoạn [-15.8433, -15.4067]. Tổng cộng: 1 vòng lặp. Thời gian: 398.79 giây.\n2025-08-12 02:28:19,852 - PID:601 - worker_601 - INFO - Vòng lặp #20... zk hiện tại = -3.741000\n2025-08-12 02:28:28,086 - PID:511 - worker_511 - INFO - KẾT THÚC xử lý đoạn [-15.4267, -14.9900]. Tổng cộng: 1 vòng lặp. Thời gian: 407.94 giây.\n2025-08-12 02:28:43,101 - PID:618 - worker_618 - INFO - Vòng lặp #20... zk hiện tại = 3.342333\n2025-08-12 02:28:47,475 - PID:622 - worker_622 - INFO - Vòng lặp #20... zk hiện tại = 4.592333\n2025-08-12 02:28:50,533 - PID:611 - worker_611 - INFO - Vòng lặp #20... zk hiện tại = 1.023626\n2025-08-12 02:28:52,788 - PID:509 - worker_509 - INFO - KẾT THÚC xử lý đoạn [-16.2600, -15.8233]. Tổng cộng: 1 vòng lặp. Thời gian: 432.95 giây.\n2025-08-12 02:29:00,331 - PID:641 - worker_641 - INFO - Vòng lặp #20... zk hiện tại = 13.414504\n2025-08-12 02:29:00,524 - PID:602 - worker_602 - INFO - KẾT THÚC xử lý đoạn [-3.3433, -2.9067]. Tổng cộng: 27 vòng lặp. Thời gian: 440.19 giây.\n2025-08-12 02:29:00,729 - PID:620 - worker_620 - INFO - Vòng lặp #20... zk hiện tại = 4.330131\n2025-08-12 02:29:09,578 - PID:652 - worker_652 - INFO - KẾT THÚC xử lý đoạn [17.0733, 17.5100]. Tổng cộng: 3 vòng lặp. Thời gian: 448.78 giây.\n2025-08-12 02:29:09,625 - PID:651 - worker_651 - INFO - KẾT THÚC xử lý đoạn [17.4900, 17.9267]. Tổng cộng: 13 vòng lặp. Thời gian: 448.77 giây.\n2025-08-12 02:29:14,028 - PID:603 - worker_603 - INFO - Vòng lặp #20... zk hiện tại = -2.171755\n2025-08-12 02:29:17,684 - PID:621 - worker_621 - INFO - Vòng lặp #20... zk hiện tại = 5.286066\n2025-08-12 02:29:22,351 - PID:599 - worker_599 - INFO - KẾT THÚC xử lý đoạn [-4.5933, -4.1567]. Tổng cộng: 18 vòng lặp. Thời gian: 462.08 giây.\n2025-08-12 02:29:23,857 - PID:592 - worker_592 - INFO - Vòng lặp #20... zk hiện tại = -7.907667\n2025-08-12 02:29:24,304 - PID:584 - worker_584 - INFO - Vòng lặp #20... zk hiện tại = -8.741000\n2025-08-12 02:29:28,009 - PID:610 - worker_610 - INFO - KẾT THÚC xử lý đoạn [-0.4267, 0.0100]. Tổng cộng: 17 vòng lặp. Thời gian: 467.63 giây.\n2025-08-12 02:29:28,468 - PID:508 - worker_508 - INFO - KẾT THÚC xử lý đoạn [-17.0933, -16.6567]. Tổng cộng: 1 vòng lặp. Thời gian: 468.53 giây.\n2025-08-12 02:29:38,137 - PID:583 - worker_583 - INFO - Vòng lặp #20... zk hiện tại = -8.859389\n2025-08-12 02:29:42,445 - PID:503 - worker_503 - INFO - KẾT THÚC xử lý đoạn [-16.6767, -16.2400]. Tổng cộng: 1 vòng lặp. Thời gian: 482.36 giây.\n2025-08-12 02:29:44,986 - PID:594 - worker_594 - INFO - Vòng lặp #20... zk hiện tại = -7.139323\n2025-08-12 02:29:53,511 - PID:588 - worker_588 - INFO - Vòng lặp #20... zk hiện tại = -8.324333\n2025-08-12 02:29:59,129 - PID:506 - worker_506 - INFO - KẾT THÚC xử lý đoạn [-17.5100, -17.0733]. Tổng cộng: 1 vòng lặp. Thời gian: 499.22 giây.\n2025-08-12 02:30:02,942 - PID:593 - worker_593 - INFO - Vòng lặp #20... zk hiện tại = -6.265211\n2025-08-12 02:30:02,972 - PID:500 - worker_500 - INFO - KẾT THÚC xử lý đoạn [-20.0000, -19.5733]. Tổng cộng: 1 vòng lặp. Thời gian: 503.18 giây.\n2025-08-12 02:30:04,562 - PID:646 - worker_646 - INFO - Vòng lặp #20... zk hiện tại = 15.842333\n2025-08-12 02:30:05,240 - PID:505 - worker_505 - INFO - KẾT THÚC xử lý đoạn [-18.3433, -17.9067]. Tổng cộng: 1 vòng lặp. Thời gian: 505.36 giây.\n2025-08-12 02:30:08,946 - PID:609 - worker_609 - INFO - Vòng lặp #20... zk hiện tại = 0.625188\n2025-08-12 02:30:09,053 - PID:594 - worker_594 - INFO - KẾT THÚC xử lý đoạn [-7.5100, -7.0733]. Tổng cộng: 22 vòng lặp. Thời gian: 508.63 giây.\n2025-08-12 02:30:11,523 - PID:589 - worker_589 - INFO - Vòng lặp #20... zk hiện tại = -9.361049\n2025-08-12 02:30:12,191 - PID:627 - worker_627 - INFO - Vòng lặp #40... zk hiện tại = 8.362333\n2025-08-12 02:30:12,830 - PID:632 - worker_632 - INFO - Vòng lặp #40... zk hiện tại = 9.612333\n2025-08-12 02:30:23,097 - PID:504 - worker_504 - INFO - KẾT THÚC xử lý đoạn [-19.1767, -18.7400]. Tổng cộng: 1 vòng lặp. Thời gian: 523.48 giây.\n2025-08-12 02:30:23,685 - PID:598 - worker_598 - INFO - Vòng lặp #20... zk hiện tại = -1.086491\n2025-08-12 02:30:24,931 - PID:615 - worker_615 - INFO - Vòng lặp #40... zk hiện tại = 7.221533\n2025-08-12 02:30:26,044 - PID:501 - worker_501 - INFO - KẾT THÚC xử lý đoạn [-19.5933, -19.1567]. Tổng cộng: 1 vòng lặp. Thời gian: 526.12 giây.\n2025-08-12 02:30:27,982 - PID:631 - worker_631 - INFO - Vòng lặp #40... zk hiện tại = 9.195667\n2025-08-12 02:30:32,600 - PID:650 - worker_650 - INFO - Vòng lặp #20... zk hiện tại = 16.259000\n2025-08-12 02:30:32,991 - PID:592 - worker_592 - INFO - KẾT THÚC xử lý đoạn [-7.9267, -7.4900]. Tổng cộng: 23 vòng lặp. Thời gian: 532.74 giây.\n2025-08-12 02:30:33,517 - PID:596 - worker_596 - INFO - Vòng lặp #20... zk hiện tại = -5.824333\n2025-08-12 02:30:35,343 - PID:498 - worker_498 - INFO - KẾT THÚC xử lý đoạn [-18.7600, -18.3233]. Tổng cộng: 1 vòng lặp. Thời gian: 535.57 giây.\n2025-08-12 02:30:37,795 - PID:595 - worker_595 - INFO - Vòng lặp #20... zk hiện tại = -5.850130\n2025-08-12 02:30:38,028 - PID:629 - worker_629 - INFO - Vòng lặp #40... zk hiện tại = 7.945667\n2025-08-12 02:30:42,051 - PID:614 - worker_614 - INFO - Vòng lặp #40... zk hiện tại = 2.112333\n2025-08-12 02:30:44,546 - PID:633 - worker_633 - INFO - Vòng lặp #40... zk hiện tại = 10.105061\n2025-08-12 02:30:45,862 - PID:589 - worker_589 - INFO - KẾT THÚC xử lý đoạn [-9.5933, -9.1567]. Tổng cộng: 23 vòng lặp. Thời gian: 545.52 giây.\n2025-08-12 02:30:50,887 - PID:613 - worker_613 - INFO - Vòng lặp #40... zk hiện tại = 1.695667\n2025-08-12 02:30:56,127 - PID:624 - worker_624 - INFO - Vòng lặp #40... zk hiện tại = 5.862333\n2025-08-12 02:30:59,489 - PID:600 - worker_600 - INFO - Vòng lặp #40... zk hiện tại = -4.054678\n2025-08-12 02:31:04,517 - PID:630 - worker_630 - INFO - Vòng lặp #40... zk hiện tại = 7.529000\n2025-08-12 02:31:04,846 - PID:502 - worker_502 - INFO - Vòng lặp #20... zk hiện tại = -13.741000\n2025-08-12 02:31:08,422 - PID:647 - worker_647 - INFO - Vòng lặp #20... zk hiện tại = 15.807860\n2025-08-12 02:31:17,213 - PID:635 - worker_635 - INFO - Vòng lặp #40... zk hiện tại = 10.898737\n2025-08-12 02:31:17,559 - PID:619 - worker_619 - INFO - Vòng lặp #40... zk hiện tại = 3.779000\n2025-08-12 02:31:17,613 - PID:648 - worker_648 - INFO - Vòng lặp #20... zk hiện tại = 18.563352\n2025-08-12 02:31:18,185 - PID:617 - worker_617 - INFO - Vòng lặp #40... zk hiện tại = 2.945667\n2025-08-12 02:31:21,823 - PID:606 - worker_606 - INFO - Vòng lặp #20... zk hiện tại = -0.465094\n2025-08-12 02:31:22,877 - PID:616 - worker_616 - INFO - Vòng lặp #40... zk hiện tại = 2.536324\n2025-08-12 02:31:25,137 - PID:634 - worker_634 - INFO - Vòng lặp #40... zk hiện tại = 10.445667\n2025-08-12 02:31:25,366 - PID:627 - worker_627 - INFO - KẾT THÚC xử lý đoạn [8.3233, 8.7600]. Tổng cộng: 49 vòng lặp. Thời gian: 584.80 giây.\n2025-08-12 02:31:28,881 - PID:626 - worker_626 - INFO - Vòng lặp #40... zk hiện tại = 6.695667\n2025-08-12 02:31:29,835 - PID:514 - worker_514 - INFO - Vòng lặp #20... zk hiện tại = -13.745241\n2025-08-12 02:31:31,816 - PID:628 - worker_628 - INFO - Vòng lặp #40... zk hiện tại = 9.074544\n2025-08-12 02:31:38,762 - PID:612 - worker_612 - INFO - KẾT THÚC xử lý đoạn [1.2400, 1.6767]. Tổng cộng: 36 vòng lặp. Thời gian: 598.28 giây.\n2025-08-12 02:31:43,845 - PID:595 - worker_595 - INFO - KẾT THÚC xử lý đoạn [-6.2600, -5.8233]. Tổng cộng: 27 vòng lặp. Thời gian: 603.50 giây.\n2025-08-12 02:31:45,669 - PID:625 - worker_625 - INFO - Vòng lặp #40... zk hiện tại = 6.279000\n2025-08-12 02:31:46,520 - PID:609 - worker_609 - INFO - KẾT THÚC xử lý đoạn [0.4067, 0.8433]. Tổng cộng: 29 vòng lặp. Thời gian: 606.17 giây.\n2025-08-12 02:31:53,344 - PID:623 - worker_623 - INFO - Vòng lặp #40... zk hiện tại = 5.445667\n2025-08-12 02:31:56,742 - PID:620 - worker_620 - INFO - Vòng lặp #40... zk hiện tại = 4.350131\n2025-08-12 02:31:58,232 - PID:601 - worker_601 - INFO - Vòng lặp #40... zk hiện tại = -3.491967\n2025-08-12 02:31:59,000 - PID:618 - worker_618 - INFO - KẾT THÚC xử lý đoạn [3.3233, 3.7600]. Tổng cộng: 35 vòng lặp. Thời gian: 618.49 giây.\n2025-08-12 02:32:00,922 - PID:512 - worker_512 - INFO - KẾT THÚC xử lý đoạn [-15.0100, -14.5733]. Tổng cộng: 11 vòng lặp. Thời gian: 620.87 giây.\n2025-08-12 02:32:02,968 - PID:622 - worker_622 - INFO - Vòng lặp #40... zk hiện tại = 4.612333\n2025-08-12 02:32:05,425 - PID:584 - worker_584 - INFO - Vòng lặp #40... zk hiện tại = -8.721000\n2025-08-12 02:32:08,143 - PID:611 - worker_611 - INFO - Vòng lặp #40... zk hiện tại = 1.043626\n2025-08-12 02:32:08,881 - PID:619 - worker_619 - INFO - KẾT THÚC xử lý đoạn [3.7400, 4.1767]. Tổng cộng: 43 vòng lặp. Thời gian: 628.53 giây.\n2025-08-12 02:32:11,276 - PID:641 - worker_641 - INFO - Vòng lặp #40... zk hiện tại = 13.676925\n2025-08-12 02:32:11,597 - PID:621 - worker_621 - INFO - Vòng lặp #40... zk hiện tại = 5.306066\n2025-08-12 02:32:18,288 - PID:514 - worker_514 - INFO - KẾT THÚC xử lý đoạn [-14.1767, -13.7400]. Tổng cộng: 25 vòng lặp. Thời gian: 638.23 giây.\n2025-08-12 02:32:20,592 - PID:598 - worker_598 - INFO - KẾT THÚC xử lý đoạn [-1.2600, -0.8233]. Tổng cộng: 29 vòng lặp. Thời gian: 640.25 giây.\n2025-08-12 02:32:21,041 - PID:606 - worker_606 - INFO - KẾT THÚC xử lý đoạn [-0.8433, -0.4067]. Tổng cộng: 26 vòng lặp. Thời gian: 640.62 giây.\n2025-08-12 02:32:25,454 - PID:583 - worker_583 - INFO - Vòng lặp #40... zk hiện tại = -8.839389\n2025-08-12 02:32:31,765 - PID:632 - worker_632 - INFO - Vòng lặp #60... zk hiện tại = 9.632333\n2025-08-12 02:32:32,476 - PID:603 - worker_603 - INFO - Vòng lặp #40... zk hiện tại = -2.151755\n2025-08-12 02:32:32,970 - PID:646 - worker_646 - INFO - Vòng lặp #40... zk hiện tại = 15.862333\n2025-08-12 02:32:39,207 - PID:593 - worker_593 - INFO - Vòng lặp #40... zk hiện tại = -6.245211\n2025-08-12 02:32:39,331 - PID:588 - worker_588 - INFO - Vòng lặp #40... zk hiện tại = -8.304333\n2025-08-12 02:32:43,820 - PID:615 - worker_615 - INFO - Vòng lặp #60... zk hiện tại = 7.241533\n2025-08-12 02:32:45,040 - PID:631 - worker_631 - INFO - Vòng lặp #60... zk hiện tại = 9.215667\n2025-08-12 02:32:54,008 - PID:603 - worker_603 - INFO - KẾT THÚC xử lý đoạn [-2.5100, -2.0733]. Tổng cộng: 42 vòng lặp. Thời gian: 673.59 giây.\n2025-08-12 02:32:55,622 - PID:650 - worker_650 - INFO - Vòng lặp #40... zk hiện tại = 16.279000\n2025-08-12 02:32:56,537 - PID:633 - worker_633 - INFO - Vòng lặp #60... zk hiện tại = 10.125061\n2025-08-12 02:32:57,327 - PID:629 - worker_629 - INFO - Vòng lặp #60... zk hiện tại = 7.965667\n2025-08-12 02:33:03,052 - PID:634 - worker_634 - INFO - KẾT THÚC xử lý đoạn [10.4067, 10.8433]. Tổng cộng: 53 vòng lặp. Thời gian: 682.57 giây.\n2025-08-12 02:33:05,565 - PID:596 - worker_596 - INFO - Vòng lặp #40... zk hiện tại = -5.804333\n2025-08-12 02:33:10,341 - PID:614 - worker_614 - INFO - Vòng lặp #60... zk hiện tại = 2.132333\n2025-08-12 02:33:11,159 - PID:613 - worker_613 - INFO - Vòng lặp #60... zk hiện tại = 1.855370\n2025-08-12 02:33:17,247 - PID:624 - worker_624 - INFO - Vòng lặp #60... zk hiện tại = 5.882333\n2025-08-12 02:33:19,365 - PID:647 - worker_647 - INFO - Vòng lặp #40... zk hiện tại = 15.827860\n2025-08-12 02:33:19,534 - PID:593 - worker_593 - INFO - KẾT THÚC xử lý đoạn [-6.6767, -6.2400]. Tổng cộng: 45 vòng lặp. Thời gian: 699.28 giây.\n2025-08-12 02:33:21,337 - PID:600 - worker_600 - INFO - Vòng lặp #60... zk hiện tại = -4.034678\n2025-08-12 02:33:28,307 - PID:630 - worker_630 - INFO - Vòng lặp #60... zk hiện tại = 7.549000\n2025-08-12 02:33:34,457 - PID:635 - worker_635 - INFO - Vòng lặp #60... zk hiện tại = 10.918737\n2025-08-12 02:33:36,934 - PID:648 - worker_648 - INFO - Vòng lặp #40... zk hiện tại = 18.583352\n2025-08-12 02:33:37,493 - PID:628 - worker_628 - INFO - Vòng lặp #60... zk hiện tại = 9.094544\n2025-08-12 02:33:41,524 - PID:626 - worker_626 - INFO - Vòng lặp #60... zk hiện tại = 6.715667\n2025-08-12 02:33:42,245 - PID:617 - worker_617 - INFO - Vòng lặp #60... zk hiện tại = 2.965667\n2025-08-12 02:33:45,202 - PID:502 - worker_502 - INFO - Vòng lặp #40... zk hiện tại = -13.721000\n2025-08-12 02:33:47,254 - PID:616 - worker_616 - INFO - Vòng lặp #60... zk hiện tại = 2.556324\n2025-08-12 02:33:50,247 - PID:641 - worker_641 - INFO - KẾT THÚC xử lý đoạn [13.3233, 13.7600]. Tổng cộng: 56 vòng lặp. Thời gian: 729.76 giây.\n2025-08-12 02:34:06,158 - PID:625 - worker_625 - INFO - Vòng lặp #60... zk hiện tại = 6.299000\n2025-08-12 02:34:11,606 - PID:623 - worker_623 - INFO - Vòng lặp #60... zk hiện tại = 5.465667\n2025-08-12 02:34:11,656 - PID:584 - worker_584 - INFO - Vòng lặp #60... zk hiện tại = -8.701000\n2025-08-12 02:34:13,856 - PID:601 - worker_601 - INFO - Vòng lặp #60... zk hiện tại = -3.471967\n2025-08-12 02:34:20,145 - PID:622 - worker_622 - INFO - Vòng lặp #60... zk hiện tại = 4.632333\n2025-08-12 02:34:20,282 - PID:620 - worker_620 - INFO - Vòng lặp #60... zk hiện tại = 4.370131\n2025-08-12 02:34:24,890 - PID:632 - worker_632 - INFO - Vòng lặp #80... zk hiện tại = 9.652333\n2025-08-12 02:34:25,375 - PID:611 - worker_611 - INFO - Vòng lặp #60... zk hiện tại = 1.063626\n2025-08-12 02:34:26,023 - PID:621 - worker_621 - INFO - Vòng lặp #60... zk hiện tại = 5.326066\n2025-08-12 02:34:35,140 - PID:631 - worker_631 - INFO - Vòng lặp #80... zk hiện tại = 9.235667\n2025-08-12 02:34:41,129 - PID:646 - worker_646 - INFO - Vòng lặp #60... zk hiện tại = 15.882333\n2025-08-12 02:34:43,281 - PID:615 - worker_615 - INFO - Vòng lặp #80... zk hiện tại = 7.261533\n2025-08-12 02:34:44,715 - PID:583 - worker_583 - INFO - Vòng lặp #60... zk hiện tại = -8.819389\n2025-08-12 02:34:44,902 - PID:647 - worker_647 - INFO - KẾT THÚC xử lý đoạn [15.4067, 15.8433]. Tổng cộng: 55 vòng lặp. Thời gian: 784.14 giây.\n2025-08-12 02:34:45,293 - PID:601 - worker_601 - INFO - KẾT THÚC xử lý đoạn [-3.7600, -3.3233]. Tổng cộng: 64 vòng lặp. Thời gian: 784.90 giây.\n2025-08-12 02:34:51,708 - PID:633 - worker_633 - INFO - Vòng lặp #80... zk hiện tại = 10.261683\n2025-08-12 02:34:54,108 - PID:588 - worker_588 - INFO - Vòng lặp #60... zk hiện tại = -8.284333\n2025-08-12 02:34:55,971 - PID:629 - worker_629 - INFO - Vòng lặp #80... zk hiện tại = 7.985667\n2025-08-12 02:34:56,353 - PID:650 - worker_650 - INFO - Vòng lặp #60... zk hiện tại = 16.546640\n2025-08-12 02:35:14,830 - PID:624 - worker_624 - INFO - Vòng lặp #80... zk hiện tại = 5.902333\n2025-08-12 02:35:17,080 - PID:614 - worker_614 - INFO - Vòng lặp #80... zk hiện tại = 2.152333\n2025-08-12 02:35:17,219 - PID:596 - worker_596 - INFO - Vòng lặp #60... zk hiện tại = -5.718584\n2025-08-12 02:35:21,975 - PID:613 - worker_613 - INFO - Vòng lặp #80... zk hiện tại = 1.875370\n2025-08-12 02:35:25,681 - PID:600 - worker_600 - INFO - Vòng lặp #80... zk hiện tại = -3.980943\n2025-08-12 02:35:27,157 - PID:628 - worker_628 - INFO - Vòng lặp #80... zk hiện tại = 9.114544\n2025-08-12 02:35:29,251 - PID:650 - worker_650 - INFO - KẾT THÚC xử lý đoạn [16.2400, 16.6767]. Tổng cộng: 60 vòng lặp. Thời gian: 828.51 giây.\n2025-08-12 02:35:30,375 - PID:596 - worker_596 - INFO - KẾT THÚC xử lý đoạn [-5.8433, -5.4067]. Tổng cộng: 61 vòng lặp. Thời gian: 830.09 giây.\n2025-08-12 02:35:34,321 - PID:630 - worker_630 - INFO - Vòng lặp #80... zk hiện tại = 7.569000\n2025-08-12 02:35:35,692 - PID:635 - worker_635 - INFO - Vòng lặp #80... zk hiện tại = 10.938737\n2025-08-12 02:35:38,870 - PID:626 - worker_626 - INFO - Vòng lặp #80... zk hiện tại = 6.735667\n2025-08-12 02:35:43,176 - PID:648 - worker_648 - INFO - Vòng lặp #60... zk hiện tại = 18.603352\n2025-08-12 02:35:49,115 - PID:617 - worker_617 - INFO - Vòng lặp #80... zk hiện tại = 2.985667\n2025-08-12 02:35:55,895 - PID:616 - worker_616 - INFO - Vòng lặp #80... zk hiện tại = 2.576324\n2025-08-12 02:36:03,346 - PID:502 - worker_502 - INFO - Vòng lặp #60... zk hiện tại = -13.701000\n2025-08-12 02:36:08,237 - PID:584 - worker_584 - INFO - Vòng lặp #80... zk hiện tại = -8.681000\n2025-08-12 02:36:08,334 - PID:632 - worker_632 - INFO - Vòng lặp #100... zk hiện tại = 9.672333\n2025-08-12 02:36:16,077 - PID:625 - worker_625 - INFO - Vòng lặp #80... zk hiện tại = 6.526777\n2025-08-12 02:36:17,177 - PID:623 - worker_623 - INFO - Vòng lặp #80... zk hiện tại = 5.485667\n2025-08-12 02:36:18,078 - PID:631 - worker_631 - INFO - Vòng lặp #100... zk hiện tại = 9.255667\n2025-08-12 02:36:27,479 - PID:622 - worker_622 - INFO - Vòng lặp #80... zk hiện tại = 4.782936\n2025-08-12 02:36:29,718 - PID:626 - worker_626 - INFO - KẾT THÚC xử lý đoạn [6.6567, 7.0933]. Tổng cộng: 88 vòng lặp. Thời gian: 888.95 giây.\n2025-08-12 02:36:29,947 - PID:621 - worker_621 - INFO - Vòng lặp #80... zk hiện tại = 5.346066\n2025-08-12 02:36:31,134 - PID:620 - worker_620 - INFO - Vòng lặp #80... zk hiện tại = 4.390131\n2025-08-12 02:36:31,172 - PID:611 - worker_611 - INFO - Vòng lặp #80... zk hiện tại = 1.130035\n2025-08-12 02:36:32,826 - PID:633 - worker_633 - INFO - Vòng lặp #100... zk hiện tại = 10.281683\n2025-08-12 02:36:35,126 - PID:615 - worker_615 - INFO - Vòng lặp #100... zk hiện tại = 7.281533\n2025-08-12 02:36:42,578 - PID:646 - worker_646 - INFO - Vòng lặp #80... zk hiện tại = 15.902333\n2025-08-12 02:36:47,568 - PID:629 - worker_629 - INFO - Vòng lặp #100... zk hiện tại = 8.005667\n2025-08-12 02:36:49,700 - PID:600 - worker_600 - INFO - KẾT THÚC xử lý đoạn [-4.1767, -3.7400]. Tổng cộng: 94 vòng lặp. Thời gian: 909.45 giây.\n2025-08-12 02:36:55,344 - PID:583 - worker_583 - INFO - Vòng lặp #80... zk hiện tại = -8.799389\n2025-08-12 02:36:57,017 - PID:588 - worker_588 - INFO - Vòng lặp #80... zk hiện tại = -8.264333\n2025-08-12 02:37:02,675 - PID:628 - worker_628 - INFO - Vòng lặp #100... zk hiện tại = 9.134544\n2025-08-12 02:37:05,208 - PID:624 - worker_624 - INFO - Vòng lặp #100... zk hiện tại = 5.922333\n2025-08-12 02:37:15,049 - PID:614 - worker_614 - INFO - Vòng lặp #100... zk hiện tại = 2.172333\n2025-08-12 02:37:21,863 - PID:613 - worker_613 - INFO - Vòng lặp #100... zk hiện tại = 1.895370\n2025-08-12 02:37:25,135 - PID:635 - worker_635 - INFO - Vòng lặp #100... zk hiện tại = 10.958737\n2025-08-12 02:37:29,151 - PID:630 - worker_630 - INFO - Vòng lặp #100... zk hiện tại = 7.848422\n2025-08-12 02:37:41,232 - PID:617 - worker_617 - INFO - Vòng lặp #100... zk hiện tại = 3.005667\n2025-08-12 02:37:42,775 - PID:648 - worker_648 - INFO - Vòng lặp #80... zk hiện tại = 18.623352\n2025-08-12 02:37:46,293 - PID:632 - worker_632 - INFO - Vòng lặp #120... zk hiện tại = 9.692333\n2025-08-12 02:37:53,789 - PID:616 - worker_616 - INFO - Vòng lặp #100... zk hiện tại = 2.596324\n2025-08-12 02:37:57,619 - PID:584 - worker_584 - INFO - Vòng lặp #100... zk hiện tại = -8.661000\n2025-08-12 02:37:59,728 - PID:631 - worker_631 - INFO - Vòng lặp #120... zk hiện tại = 9.295833\n2025-08-12 02:38:08,427 - PID:502 - worker_502 - INFO - Vòng lặp #80... zk hiện tại = -13.681000\n2025-08-12 02:38:09,419 - PID:625 - worker_625 - INFO - Vòng lặp #100... zk hiện tại = 6.546777\n2025-08-12 02:38:14,056 - PID:623 - worker_623 - INFO - Vòng lặp #100... zk hiện tại = 5.569707\n2025-08-12 02:38:14,398 - PID:611 - worker_611 - INFO - KẾT THÚC xử lý đoạn [0.8233, 1.2600]. Tổng cộng: 97 vòng lặp. Thời gian: 994.06 giây.\n2025-08-12 02:38:14,499 - PID:633 - worker_633 - INFO - Vòng lặp #120... zk hiện tại = 10.301683\n2025-08-12 02:38:19,010 - PID:622 - worker_622 - INFO - KẾT THÚC xử lý đoạn [4.5733, 5.0100]. Tổng cộng: 98 vòng lặp. Thời gian: 998.56 giây.\n2025-08-12 02:38:21,772 - PID:615 - worker_615 - INFO - Vòng lặp #120... zk hiện tại = 7.472000\n2025-08-12 02:38:24,150 - PID:621 - worker_621 - INFO - Vòng lặp #100... zk hiện tại = 5.366066\n2025-08-12 02:38:33,063 - PID:629 - worker_629 - INFO - Vòng lặp #120... zk hiện tại = 8.025667\n2025-08-12 02:38:33,483 - PID:620 - worker_620 - INFO - Vòng lặp #100... zk hiện tại = 4.410131\n2025-08-12 02:38:33,616 - PID:646 - worker_646 - INFO - Vòng lặp #100... zk hiện tại = 15.922333\n2025-08-12 02:38:45,314 - PID:648 - worker_648 - INFO - KẾT THÚC xử lý đoạn [18.3233, 18.7600]. Tổng cộng: 90 vòng lặp. Thời gian: 1024.34 giây.\n2025-08-12 02:38:47,735 - PID:628 - worker_628 - INFO - Vòng lặp #120... zk hiện tại = 9.154544\n2025-08-12 02:38:51,382 - PID:588 - worker_588 - INFO - Vòng lặp #100... zk hiện tại = -8.244333\n2025-08-12 02:38:55,932 - PID:624 - worker_624 - INFO - Vòng lặp #120... zk hiện tại = 5.980661\n2025-08-12 02:38:58,965 - PID:583 - worker_583 - INFO - Vòng lặp #100... zk hiện tại = -8.779389\n2025-08-12 02:39:07,272 - PID:614 - worker_614 - INFO - Vòng lặp #120... zk hiện tại = 2.192333\n2025-08-12 02:39:09,676 - PID:635 - worker_635 - INFO - Vòng lặp #120... zk hiện tại = 10.978737\n2025-08-12 02:39:13,549 - PID:613 - worker_613 - INFO - Vòng lặp #120... zk hiện tại = 1.915370\n2025-08-12 02:39:14,224 - PID:630 - worker_630 - INFO - Vòng lặp #120... zk hiện tại = 7.868422\n2025-08-12 02:39:18,131 - PID:588 - worker_588 - INFO - KẾT THÚC xử lý đoạn [-8.3433, -7.9067]. Tổng cộng: 104 vòng lặp. Thời gian: 1057.93 giây.\n2025-08-12 02:39:19,043 - PID:502 - worker_502 - INFO - KẾT THÚC xử lý đoạn [-13.7600, -13.3233]. Tổng cộng: 89 vòng lặp. Thời gian: 1058.99 giây.\n2025-08-12 02:39:24,097 - PID:617 - worker_617 - INFO - Vòng lặp #120... zk hiện tại = 3.025667\n2025-08-12 02:39:24,401 - PID:632 - worker_632 - INFO - Vòng lặp #140... zk hiện tại = 9.712333\n2025-08-12 02:39:35,098 - PID:629 - worker_629 - INFO - KẾT THÚC xử lý đoạn [7.9067, 8.3433]. Tổng cộng: 132 vòng lặp. Thời gian: 1074.65 giây.\n2025-08-12 02:39:41,606 - PID:616 - worker_616 - INFO - Vòng lặp #120... zk hiện tại = 2.616324\n2025-08-12 02:39:43,582 - PID:584 - worker_584 - INFO - Vòng lặp #120... zk hiện tại = -8.641000\n2025-08-12 02:39:44,966 - PID:631 - worker_631 - INFO - Vòng lặp #140... zk hiện tại = 9.571985\n2025-08-12 02:39:45,507 - PID:633 - worker_633 - INFO - KẾT THÚC xử lý đoạn [9.9900, 10.4267]. Tổng cộng: 137 vòng lặp. Thời gian: 1085.02 giây.\n2025-08-12 02:39:51,478 - PID:625 - worker_625 - INFO - Vòng lặp #120... zk hiện tại = 6.566777\n2025-08-12 02:39:56,871 - PID:615 - worker_615 - INFO - Vòng lặp #140... zk hiện tại = 7.492000\n2025-08-12 02:39:57,661 - PID:623 - worker_623 - INFO - Vòng lặp #120... zk hiện tại = 5.589707\n2025-08-12 02:40:07,605 - PID:621 - worker_621 - INFO - Vòng lặp #120... zk hiện tại = 5.386066\n2025-08-12 02:40:16,528 - PID:646 - worker_646 - INFO - Vòng lặp #120... zk hiện tại = 15.942333\n2025-08-12 02:40:18,043 - PID:628 - worker_628 - INFO - Vòng lặp #140... zk hiện tại = 9.174544\n2025-08-12 02:40:23,651 - PID:624 - worker_624 - INFO - Vòng lặp #140... zk hiện tại = 6.000661\n2025-08-12 02:40:27,484 - PID:620 - worker_620 - INFO - Vòng lặp #120... zk hiện tại = 4.430131\n2025-08-12 02:40:30,569 - PID:628 - worker_628 - INFO - KẾT THÚC xử lý đoạn [8.7400, 9.1767]. Tổng cộng: 142 vòng lặp. Thời gian: 1130.04 giây.\n2025-08-12 02:40:39,644 - PID:630 - worker_630 - INFO - Vòng lặp #140... zk hiện tại = 7.888422\n2025-08-12 02:40:43,675 - PID:635 - worker_635 - INFO - Vòng lặp #140... zk hiện tại = 10.998737\n2025-08-12 02:40:46,845 - PID:632 - worker_632 - INFO - Vòng lặp #160... zk hiện tại = 9.732333\n2025-08-12 02:40:48,548 - PID:614 - worker_614 - INFO - Vòng lặp #140... zk hiện tại = 2.213647\n2025-08-12 02:40:48,989 - PID:583 - worker_583 - INFO - Vòng lặp #120... zk hiện tại = -8.759389\n2025-08-12 02:40:53,572 - PID:613 - worker_613 - INFO - Vòng lặp #140... zk hiện tại = 1.935370\n2025-08-12 02:40:55,252 - PID:617 - worker_617 - INFO - Vòng lặp #140... zk hiện tại = 3.045667\n2025-08-12 02:41:03,223 - PID:624 - worker_624 - INFO - KẾT THÚC xử lý đoạn [5.8233, 6.2600]. Tổng cộng: 148 vòng lặp. Thời gian: 1162.67 giây.\n2025-08-12 02:41:09,421 - PID:631 - worker_631 - INFO - Vòng lặp #160... zk hiện tại = 9.591985\n2025-08-12 02:41:12,680 - PID:615 - worker_615 - INFO - KẾT THÚC xử lý đoạn [7.0733, 7.5100]. Tổng cộng: 157 vòng lặp. Thời gian: 1172.14 giây.\n2025-08-12 02:41:17,902 - PID:631 - worker_631 - INFO - KẾT THÚC xử lý đoạn [9.1567, 9.5933]. Tổng cộng: 161 vòng lặp. Thời gian: 1177.24 giây.\n2025-08-12 02:41:18,447 - PID:616 - worker_616 - INFO - Vòng lặp #140... zk hiện tại = 2.636324\n2025-08-12 02:41:20,325 - PID:584 - worker_584 - INFO - Vòng lặp #140... zk hiện tại = -8.621000\n2025-08-12 02:41:23,252 - PID:625 - worker_625 - INFO - Vòng lặp #140... zk hiện tại = 6.623743\n2025-08-12 02:41:33,081 - PID:623 - worker_623 - INFO - Vòng lặp #140... zk hiện tại = 5.609707\n2025-08-12 02:41:39,682 - PID:621 - worker_621 - INFO - Vòng lặp #140... zk hiện tại = 5.406066\n2025-08-12 02:41:46,433 - PID:613 - worker_613 - INFO - KẾT THÚC xử lý đoạn [1.6567, 2.0933]. Tổng cộng: 151 vòng lặp. Thời gian: 1205.82 giây.\n2025-08-12 02:41:47,884 - PID:646 - worker_646 - INFO - Vòng lặp #140... zk hiện tại = 15.962333\n2025-08-12 02:42:04,993 - PID:620 - worker_620 - INFO - Vòng lặp #140... zk hiện tại = 4.450131\n2025-08-12 02:42:05,431 - PID:621 - worker_621 - INFO - KẾT THÚC xử lý đoạn [4.9900, 5.4267]. Tổng cộng: 145 vòng lặp. Thời gian: 1225.09 giây.\n2025-08-12 02:42:05,538 - PID:630 - worker_630 - INFO - Vòng lặp #160... zk hiện tại = 7.908422\n2025-08-12 02:42:05,758 - PID:632 - worker_632 - INFO - Vòng lặp #180... zk hiện tại = 9.752333\n2025-08-12 02:42:09,257 - PID:635 - worker_635 - INFO - Vòng lặp #160... zk hiện tại = 11.018737\n2025-08-12 02:42:21,473 - PID:617 - worker_617 - INFO - Vòng lặp #160... zk hiện tại = 3.065667\n2025-08-12 02:42:23,806 - PID:583 - worker_583 - INFO - KẾT THÚC xử lý đoạn [-9.1767, -8.7400]. Tổng cộng: 139 vòng lặp. Thời gian: 1243.62 giây.\n2025-08-12 02:42:29,108 - PID:614 - worker_614 - INFO - Vòng lặp #160... zk hiện tại = 2.480952\n2025-08-12 02:42:35,061 - PID:623 - worker_623 - INFO - KẾT THÚC xử lý đoạn [5.4067, 5.8433]. Tổng cộng: 152 vòng lặp. Thời gian: 1254.54 giây.\n2025-08-12 02:42:44,324 - PID:616 - worker_616 - INFO - Vòng lặp #160... zk hiện tại = 2.656324\n2025-08-12 02:42:45,189 - PID:625 - worker_625 - INFO - Vòng lặp #160... zk hiện tại = 6.643743\n2025-08-12 02:42:47,164 - PID:584 - worker_584 - INFO - Vòng lặp #160... zk hiện tại = -8.601000\n2025-08-12 02:43:02,060 - PID:646 - worker_646 - INFO - Vòng lặp #160... zk hiện tại = 15.982333\n2025-08-12 02:43:07,955 - PID:632 - worker_632 - INFO - KẾT THÚC xử lý đoạn [9.5733, 10.0100]. Tổng cộng: 196 vòng lặp. Thời gian: 1287.48 giây.\n2025-08-12 02:43:18,640 - PID:630 - worker_630 - INFO - KẾT THÚC xử lý đoạn [7.4900, 7.9267]. Tổng cộng: 178 vòng lặp. Thời gian: 1298.14 giây.\n2025-08-12 02:43:23,440 - PID:635 - worker_635 - INFO - Vòng lặp #180... zk hiện tại = 11.038737\n2025-08-12 02:43:28,789 - PID:620 - worker_620 - INFO - Vòng lặp #160... zk hiện tại = 4.470131\n2025-08-12 02:43:48,055 - PID:614 - worker_614 - INFO - Vòng lặp #180... zk hiện tại = 2.500952\n2025-08-12 02:43:55,776 - PID:635 - worker_635 - INFO - KẾT THÚC xử lý đoạn [10.8233, 11.2600]. Tổng cộng: 188 vòng lặp. Thời gian: 1335.22 giây.\n2025-08-12 02:43:56,564 - PID:625 - worker_625 - INFO - Vòng lặp #180... zk hiện tại = 6.663743\n2025-08-12 02:43:56,932 - PID:617 - worker_617 - INFO - Vòng lặp #180... zk hiện tại = 3.329933\n2025-08-12 02:43:58,747 - PID:616 - worker_616 - INFO - Vòng lặp #180... zk hiện tại = 2.676324\n2025-08-12 02:44:00,359 - PID:584 - worker_584 - INFO - Vòng lặp #180... zk hiện tại = -8.581000\n2025-08-12 02:44:01,294 - PID:617 - worker_617 - INFO - KẾT THÚC xử lý đoạn [2.9067, 3.3433]. Tổng cộng: 180 vòng lặp. Thời gian: 1340.90 giây.\n2025-08-12 02:44:11,009 - PID:646 - worker_646 - INFO - Vòng lặp #180... zk hiện tại = 16.002333\n2025-08-12 02:44:22,235 - PID:614 - worker_614 - INFO - KẾT THÚC xử lý đoạn [2.0733, 2.5100]. Tổng cộng: 189 vòng lặp. Thời gian: 1361.83 giây.\n2025-08-12 02:44:36,576 - PID:625 - worker_625 - INFO - KẾT THÚC xử lý đoạn [6.2400, 6.6767]. Tổng cộng: 192 vòng lặp. Thời gian: 1375.94 giây.\n2025-08-12 02:44:41,691 - PID:620 - worker_620 - INFO - Vòng lặp #180... zk hiện tại = 4.490131\n2025-08-12 02:45:04,009 - PID:616 - worker_616 - INFO - Vòng lặp #200... zk hiện tại = 2.696324\n2025-08-12 02:45:09,527 - PID:584 - worker_584 - INFO - Vòng lặp #200... zk hiện tại = -8.561000\n2025-08-12 02:45:36,563 - PID:646 - worker_646 - INFO - Vòng lặp #200... zk hiện tại = 16.230389\n2025-08-12 02:45:50,434 - PID:620 - worker_620 - INFO - KẾT THÚC xử lý đoạn [4.1567, 4.5933]. Tổng cộng: 199 vòng lặp. Thời gian: 1449.82 giây.\n2025-08-12 02:45:55,069 - PID:646 - worker_646 - INFO - KẾT THÚC xử lý đoạn [15.8233, 16.2600]. Tổng cộng: 205 vòng lặp. Thời gian: 1454.28 giây.\n2025-08-12 02:46:10,850 - PID:616 - worker_616 - INFO - Vòng lặp #220... zk hiện tại = 2.716324\n2025-08-12 02:46:17,366 - PID:584 - worker_584 - INFO - Vòng lặp #220... zk hiện tại = -8.541000\n2025-08-12 02:47:08,467 - PID:584 - worker_584 - INFO - KẾT THÚC xử lý đoạn [-8.7600, -8.3233]. Tổng cộng: 234 vòng lặp. Thời gian: 1528.24 giây.\n2025-08-12 02:47:17,246 - PID:616 - worker_616 - INFO - Vòng lặp #240... zk hiện tại = 2.736324\n2025-08-12 02:48:23,760 - PID:616 - worker_616 - INFO - Vòng lặp #260... zk hiện tại = 2.756324\n2025-08-12 02:49:29,748 - PID:616 - worker_616 - INFO - Vòng lặp #280... zk hiện tại = 2.776324\n2025-08-12 02:50:40,391 - PID:616 - worker_616 - INFO - Vòng lặp #300... zk hiện tại = 2.835818\n2025-08-12 02:51:23,776 - PID:616 - worker_616 - INFO - KẾT THÚC xử lý đoạn [2.4900, 2.9267]. Tổng cộng: 312 vòng lặp. Thời gian: 1783.26 giây.\n","output_type":"stream"},{"name":"stdout","text":"    -> p-value = 0.0 (Thời gian: 1929.55s)\n\n--- Giai đoạn 3: Phân tích Kết quả Cuối cùng ---\n\nBảng kết quả Suy luận Chọn lọc:\n         raw_p_value  adjusted_p_value  is_significant  lasso_coefficient\nfeature                                                                  \nbg-0-00          0.0               0.0            True           2.422685\n","output_type":"stream"}],"execution_count":4},{"cell_type":"code","source":"# import numpy as np\n# import logging\n# import pandas as pd\n# import matplotlib.pyplot as plt\n# import statsmodels.api as sm\n# from sklearn.preprocessing import StandardScaler\n# from sklearn.linear_model import Lasso\n# from sklearn import linear_model\n# from statsmodels.stats.multitest import multipletests\n# from mpmath import mp\n# import time\n\n# from joblib import Parallel, delayed\n# from multiprocessing import shared_memory\n\n# import os\n\n# mp.dps = 50\n\n# def construct_A_XA_Ac_XAc_bhA(X, bh):\n#     p = X.shape[1]\n#     A = sorted(list(np.where(bh != 0)[0]))\n#     XA = X[:, A] if A else np.empty((X.shape[0], 0))\n\n#     return A, XA\n\n# def construct_test_statistic(j, XA, y, A):\n#     ej = np.zeros((len(A), 1))\n#     ej[A.index(j)] = 1\n#     inv = np.linalg.pinv(XA.T @ XA)\n#     etaj = XA @ inv @ ej\n#     etajTy = (etaj.T @ y)[0, 0]\n\n#     return etaj, etajTy\n\n\n\n# def compute_yz(y, etaj, zk, n, sigma_squared):\n\n#     sq_norm = sigma_squared*(etaj.T @ etaj)\n#     if sq_norm < 1e-12: sq_norm = 1e-12\n\n#     # --- PHẦN TỐI ƯU HÓA ---\n#     # Thay vì tạo ma trận proj_matrix (n x n), chúng ta tính toán trực tiếp.\n#     # a = (I - (ηηᵀ)/||η||²)y = y - η(ηᵀy)/||η||²\n    \n#     # 1. Tính tích trong (inner product) trước -> ra một số vô hướng\n#     # etajTy_scalar = (etaj.T @ y)[0, 0]\n#     etajTy_scalar = (etaj.T @ y)\n    \n#     # 2. Tính vector \"a\" bằng các phép toán trên vector\n#     a = y - etaj * (etajTy_scalar / sq_norm)*sigma_squared\n#     # -----------------------\n    \n#     b = (etaj / sq_norm) * sigma_squared\n#     yz = a + b * zk\n   \n#     return yz, b\n\n\n\n\n# def compute_polyhedron(X, M, s, lambda_val):\n#     n, p = X.shape\n#     if not M: return np.empty((0, n)), np.empty(0)\n    \n#     X_M = X[:, M]\n#     X_notM_indices = np.setdiff1d(np.arange(p), M)\n#     X_notM = X[:, X_notM_indices]\n    \n#     try:\n#         XATXA_inv = np.linalg.pinv(X_M.T @ X_M)\n#     except np.linalg.LinAlgError:\n#         return np.empty((0, n)), np.empty(0)\n\n#     A0, b0 = np.empty((0, n)), np.empty(0)\n#     if X_notM.shape[1] > 0:\n#         # TỐI ƯU HÓA TỐT HƠN NỮA\n#         # Tính X_notM.T @ P_M mà không cần tạo P_M (n x n)\n#         # X_notM.T @ P_M = X_notM.T @ (X_M @ inv(X_M.T @ X_M) @ X_M.T)\n#         #                = (X_notM.T @ X_M) @ inv(X_M.T @ X_M) @ X_M.T\n#         term_k_x_k = X_notM.T @ X_M @ XATXA_inv\n#         X_notM_T_P_M = term_k_x_k @ X_M.T\n        \n#         # A0_T = (1/lambda_val) * (X_notM.T - X_notM.T @ P_M)\n#         A0_T = (1/lambda_val) * (X_notM.T - X_notM_T_P_M)\n        \n#         A0 = np.vstack([A0_T, -A0_T])\n        \n#         XT_M_pinv = np.linalg.pinv(X_M.T)\n#         s_term = X_notM.T @ XT_M_pinv @ s\n#         b0 = np.hstack([np.ones(X_notM.shape[1]) - s_term, \n#                         np.ones(X_notM.shape[1]) + s_term])\n    \n#     A1 = -np.diag(s) @ XATXA_inv @ X_M.T\n#     b1 = -lambda_val * np.diag(s) @ XATXA_inv @ s\n    \n#     return np.vstack([A0, A1]), np.hstack([b0, b1])\n\n# def compute_truncation_bounds(A, b, eta, y):\n#     eta = eta.ravel()\n#     y = y.ravel()\n#     eta_norm = np.dot(eta, eta)\n#     if eta_norm < 1e-10:\n#         raise ValueError(\"eta has near-zero norm\")\n#     c = eta / eta_norm\n#     z = y - np.dot(eta, y) * c\n#     Ac = A @ c\n#     Az = A @ z\n#     V_minus = None\n#     V_plus = None\n#     V_zero = np.inf\n#     for j in range(A.shape[0]):\n#         if abs(Ac[j]) == 0:\n#             V_zero = min(V_zero, b[j] - Az[j])\n#         elif Ac[j] < 0:\n#             if V_minus is None or (b[j] - Az[j]) / Ac[j] > V_minus:\n#                 V_minus = (b[j] - Az[j]) / Ac[j]\n#         elif Ac[j] > 0:\n#             if V_plus is None or (b[j] - Az[j]) / Ac[j] < V_plus:\n#                 V_plus = (b[j] - Az[j]) / Ac[j]\n#     if V_minus is None:\n#         V_minus = -np.inf\n#     if V_plus is None:\n#         V_plus = np.inf\n#     if V_zero < 0:\n#         raise ValueError(\"Invalid truncation bounds: V_zero < 0\")\n\n \n\n#     return V_minus, V_plus\n# def parametric_lasso(X, yz, lamda, b, n, p,eta_j):\n#     yz_flatten = yz.flatten()\n#     clf = linear_model.Lasso(alpha=lamda/n, fit_intercept=False, tol=1e-10)\n#     clf.fit(X, yz_flatten)\n#     bhz = clf.coef_\n\n#     A, XA = construct_A_XA_Ac_XAc_bhA(X, bhz)\n#     s=np.sign(bhz[A])\n#     A1,b1= compute_polyhedron(X,A,s, lamda)\n#     V_l,V_r=compute_truncation_bounds(A1, b1, eta_j, yz_flatten)\n#     print(\"Done5\")\n#     print(\"V_l: \",V_l)\n#     print(\"V_r: \",V_r)\n\n#     return V_l,V_r, A, bhz\n\n# # ============================\n# # Hàm tạo/attach shared memory\n# # ============================\n\n# def create_shared_array(arr: np.ndarray):\n#     shm = shared_memory.SharedMemory(create=True, size=arr.nbytes)\n#     shm_arr = np.ndarray(arr.shape, dtype=arr.dtype, buffer=shm.buf)\n#     shm_arr[:] = arr[:]\n#     return shm, arr.shape, arr.dtype.str\n\n# def attach_shared_array(shm_name, shape, dtype_str):\n#     shm = shared_memory.SharedMemory(name=shm_name)\n#     arr = np.ndarray(shape, dtype=np.dtype(dtype_str), buffer=shm.buf)\n#     return shm, arr\n\n# # ============================\n# # Worker xử lý 1 đoạn zk\n# # ============================\n\n\n# def setup_worker_logging(worker_id):\n#     \"\"\"Cấu hình logger cho mỗi tiến trình con.\"\"\"\n#     logger = logging.getLogger(f\"worker_{worker_id}\")\n#     logger.setLevel(logging.INFO)  # Chỉ ghi log từ mức INFO trở lên\n\n#     # Tạo handler để ghi ra console\n#     handler = logging.StreamHandler()\n    \n#     # Tạo formatter để định dạng log message\n#     # Bao gồm: Thời gian - ID Tiến trình - Tên Logger - Mức độ - Nội dung\n#     formatter = logging.Formatter(\n#         '%(asctime)s - PID:%(process)d - %(name)s - %(levelname)s - %(message)s'\n#     )\n#     handler.setFormatter(formatter)\n\n#     # Thêm handler vào logger (nếu chưa có)\n#     if not logger.handlers:\n#         logger.addHandler(handler)\n        \n#     return logger\n\n\n# def process_segment(z_start, z_end,\n#                     X_shm_name, X_shape, X_dtype,\n#                     y_shm_name, y_shape, y_dtype,\n#                     etaj_shm_name, etaj_shape, etaj_dtype,\n#                     alpha, sigma_sq, small_eps=0.001, max_iter=2000,\n#                     lasso_tol=1e-4, lasso_max_iter=20000):\n    \n#     # --- SỬA ĐỔI 1: Thiết lập logger và log khi bắt đầu ---\n#     worker_id = os.getpid()\n#     logger = setup_worker_logging(worker_id)\n#     logger.info(f\"BẮT ĐẦU xử lý đoạn [{z_start:.4f}, {z_end:.4f}]\")\n    \n#     start_time = time.time()\n\n#     # Attach shared arrays\n#     shmX, X = attach_shared_array(X_shm_name, X_shape, X_dtype)\n#     shmy, y = attach_shared_array(y_shm_name, y_shape, y_dtype)\n#     shmetaj, etaj = attach_shared_array(etaj_shm_name, etaj_shape, etaj_dtype)\n\n#     n = X.shape[0]\n#     results = []\n#     clf = Lasso(alpha=alpha / n, fit_intercept=False, tol=lasso_tol, warm_start=True, max_iter=lasso_max_iter)\n\n#     zk = float(z_start)\n#     it = 0\n#     # --- SỬA ĐỔI 2: Tạo biến để kiểm soát tần suất log, tránh làm ngập màn hình ---\n#     log_interval = 20  # Chỉ in log sau mỗi 250 vòng lặp\n\n#     while zk < z_end and it < max_iter:\n#         it += 1\n        \n#         # --- SỬA ĐỔI 3: Log \"nhịp tim\" của worker ---\n#         # Điều này cho bạn biết worker có bị \"treo\" hay không.\n#         if it == 1 or it % log_interval == 0:\n#             logger.info(f\"Vòng lặp #{it}... zk hiện tại = {zk:.6f}\")\n\n#         yz, b_vec = compute_yz(y, etaj, zk, n, sigma_sq)\n#         yz_flat = yz.flatten()\n\n    \n        \n       \n#         clf.fit(X, yz_flat)\n       \n#         bhz = clf.coef_.copy()\n\n#         A, _ = construct_A_XA_Ac_XAc_bhA(X, bhz)\n\n#         if len(A) == 0:\n#             V_l, V_r = zk, z_end\n#         else:\n#             s = np.sign(bhz[A])\n#             A1, b1 = compute_polyhedron(X, A, s, alpha)\n#             try:\n#                 V_l, V_r = compute_truncation_bounds(A1, b1, etaj, yz_flat)\n#             except Exception as e:\n#                 logger.error(f\"Lỗi tại vòng lặp {it}, zk={zk:.4f}: {e}. Dùng bước nhảy nhỏ.\")\n#                 V_l, V_r = zk, zk + small_eps\n\n#         results.append((zk, A, bhz))\n        \n#         # --- SỬA ĐỔI 4 (Tùy chọn): Log kết quả của mỗi bước nhảy ---\n#         # Bỏ comment dòng dưới nếu bạn muốn xem chi tiết tuyệt đối, nhưng nó sẽ tạo ra RẤT NHIỀU log.\n#         # logger.debug(f\"Loop {it}: zk={zk:.4f} -> new V_r={V_r:.4f}. Active set size: {len(A)}\")\n#         # Lưu ý: Phải đổi logger.setLevel(logging.DEBUG) ở trên để thấy log này.\n\n#         if not np.isfinite(V_r) or V_r <= zk + 1e-12:\n#             zk = zk + small_eps\n#         else:\n#             zk = min(V_r + small_eps, z_end)\n\n#     shmX.close()\n#     shmy.close()\n#     shmetaj.close()\n    \n#     # --- SỬA ĐỔI 5: Log khi kết thúc và báo cáo tổng kết ---\n#     end_time = time.time()\n#     duration = end_time - start_time\n    \n#     if it >= max_iter:\n#         logger.warning(f\"ĐÃ ĐẠT GIỚI HẠN {max_iter} vòng lặp. Worker có thể chưa xử lý xong.\")\n\n#     logger.info(f\"KẾT THÚC xử lý đoạn [{z_start:.4f}, {z_end:.4f}]. \"\n#                 f\"Tổng cộng: {it} vòng lặp. Thời gian: {duration:.2f} giây.\")\n\n#     return results\n\n# # ============================\n# # Hàm song song hóa chính\n# # ============================\n\n# def run_parametric_lasso(X, y, alpha, etaj, threshold, sigma_sq,\n#                                  n_segments=5, overlap=1e-8, **worker_kwargs):\n#     shmX, X_shape, X_dtype = create_shared_array(X)\n#     shmy, y_shape, y_dtype = create_shared_array(y.reshape(-1))\n#     shmetaj, etaj_shape, etaj_dtype = create_shared_array(etaj.reshape(-1))\n\n#     edges = np.linspace(-threshold, threshold, n_segments + 1)\n#     segments = []\n#     for i in range(n_segments):\n#         z0 = edges[i] - (overlap if i > 0 else 0.0)\n#         z1 = edges[i+1] + (overlap if i < n_segments - 1 else 0.0)\n#         z0 = max(z0, -threshold)\n#         z1 = min(z1, threshold)\n#         segments.append((z0, z1))\n\n#     parallel = Parallel(n_jobs=n_segments)\n#     jobs = (delayed(process_segment)(\n#                 z0, z1,\n#                 shmX.name, X_shape, X_dtype,\n#                 shmy.name, y_shape, y_dtype,\n#                 shmetaj.name, etaj_shape, etaj_dtype,\n#                 alpha, sigma_sq,\n#                 **worker_kwargs\n#             ) for (z0, z1) in segments)\n#     segment_results = parallel(jobs)\n\n#     shmX.close(); shmX.unlink()\n#     shmy.close(); shmy.unlink()\n#     shmetaj.close(); shmetaj.unlink()\n\n#     all_entries = []\n#     for seg in segment_results:\n#         all_entries.extend(seg)\n#     all_entries.sort(key=lambda t: t[0])\n\n#     merged_zk = []\n#     merged_active_sets = []\n#     merged_bhz = []\n#     tol = 1e-8\n#     for zk, A, bhz in all_entries:\n#         if merged_zk and abs(zk - merged_zk[-1]) < tol:\n#             continue\n#         merged_zk.append(float(zk))\n#         merged_active_sets.append(A)\n#         merged_bhz.append(bhz)\n\n#     if len(merged_zk) == 0 or merged_zk[-1] < threshold - 1e-12:\n#         merged_zk.append(float(threshold))\n\n#     return merged_zk, merged_active_sets, merged_bhz\n\n# # SỬA ĐỔI 3: Hàm p_value nhận z_obs và đã sửa lỗi logic\n# def p_value(A_obs, list_active_set, list_zk, etaj, z_obs, cov_matrix):\n#     tn_sigma = np.sqrt((etaj.T @ cov_matrix @ etaj))[0, 0]\n#     if tn_sigma < 1e-9: return None\n    \n#     z_intervals = []\n#     for i, active_set in enumerate(list_active_set):\n#         if set(A_obs) == set(active_set):\n#             z_intervals.append([list_zk[i], list_zk[i+1]])\n\n#     if not z_intervals: return None\n\n#     tn_mu = 0\n#     numerator = mp.mpf(0)\n#     denominator = mp.mpf(0)\n    \n#     for al, ar in z_intervals:\n#         prob_interval = mp.ncdf((ar - tn_mu)/tn_sigma) - mp.ncdf((al - tn_mu)/tn_sigma)\n#         denominator += prob_interval\n#         if z_obs >= ar:\n#             numerator += prob_interval\n#         elif z_obs > al:\n#             numerator += mp.ncdf((z_obs - tn_mu)/tn_sigma) - mp.ncdf((al - tn_mu)/tn_sigma)\n            \n#     if denominator < 1e-100: return None\n    \n#     pivot_val = float(numerator / denominator)\n#     print(\"Done7\")\n#     return 2 * min(pivot_val, 1 - pivot_val)\n\n# # =============================================================================\n# # HÀM CHẠY CHÍNH: QUY TRÌNH PHÂN TÍCH DỮ LIỆU THỰC\n# # =============================================================================\n\n# if __name__ == '__main__':\n#     # --- BƯỚC 0: CHUẨN BỊ DỮ LIỆU ĐẦU VÀO ---\n    \n#     print(\"Sử dụng dữ liệu X_clean và y_clean...\")\n   \n#     X_clean =df_train_final\n#     y_clean =y_target\n    \n#     print(f\"Dữ liệu đầu vào: X_clean.shape={X_clean.shape}, y_clean.shape={y_clean.shape}\")\n\n#     # --- GIAI ĐOẠN 1: LỰA CHỌN MÔ HÌNH BẰNG LASSO (KHÔNG DÙNG CV) ---\n#     print(\"\\n--- Giai đoạn 1: Lựa chọn Mô hình bằng Lasso ---\")\n\n#     # 1.1. Chuẩn hóa X\n#     print(\"Đang chuẩn hóa X_clean...\")\n#     scaler = StandardScaler()\n#     X_columns = X_clean.columns\n#     X_scaled = scaler.fit_transform(X_clean)\n#     n, p = X_scaled.shape\n#     BEST_ALPHA = 6000\n#     print(f\"Sử dụng alpha cố định: {BEST_ALPHA:.4f}\")\n#     lasso_model = Lasso(alpha=BEST_ALPHA/n).fit(X_scaled, y_clean)\n#     A_obs, XA_obs = construct_A_XA_Ac_XAc_bhA(X_scaled, lasso_model.coef_)\n\n#     if not A_obs:\n#         print(\"Lasso không chọn đặc trưng nào. Kết thúc.\")\n#         exit()\n\n#     print(f\"\\nLasso đã chọn {len(A_obs)} đặc trưng.\")\n#     print(\"Các đặc trưng được chọn:\", X_columns[A_obs].tolist())\n\n#     # SỬA ĐỔI 4: Ước lượng phương sai nhiễu (σ²)\n\n    \n#     y_pred = lasso_model.predict(X_scaled)\n#     df_residuals = n - len(A_obs)\n#     if df_residuals <= 0:\n#         raise ValueError(\"Không thể ước lượng sigma^2.\")\n#     sigma_squared_hat = 1\n#     print(f\"Ước lượng phương sai nhiễu (σ^2): {sigma_squared_hat:.4f}\")\n\n#     # --- GIAI ĐOẠN 2: SUY LUẬN CHỌN LỌC ---\n#     print(f\"\\n--- Giai đoạn 2: Bắt đầu Suy luận Chọn lọc cho {len(A_obs)} đặc trưng ---\")\n#     p_values_dict = {}\n    \n#     y_col_vector = y_clean.values.reshape(-1, 1)\n\n#     for i, j_selected in enumerate(A_obs):\n#         feature_name = X_columns[j_selected]\n#         start_time = time.time()\n#         print(f\"  [{i+1}/{len(A_obs)}] Đang phân tích '{feature_name}'...\")\n#         etaj, etajTy_orig = construct_test_statistic(j_selected, XA_obs, y_col_vector, A_obs)\n#         sq_norm_eta = (etaj.T @ etaj)\n#         if sq_norm_eta < 1e-12: sq_norm_eta = 1e-12\n        \n#         # Tối ưu hóa việc tính a_vec, tránh tạo ma trận n x n\n#         etajTy_scalar = (etaj.T @ y_col_vector)\n#         a_vec = y_col_vector - etaj * (etajTy_scalar / sq_norm_eta)\n#         z_obs = etajTy_orig      \n#         sigma_z = np.sqrt(sq_norm_eta * sigma_squared_hat)\n#         # threshold = 20 * sigma_z\n#         threshold = 20 * 1\n\n#         n_segments = os.cpu_count()  # số core logic của CPU\n        \n#         list_zk, list_active_set, list_bhz = run_parametric_lasso(\n#             X_scaled, y_col_vector, BEST_ALPHA, etaj,\n#             threshold=20.0, sigma_sq=1.0,\n#             n_segments=n_segments,  # CHỈ THÊM DÒNG NÀY\n#             small_eps=0.001, max_iter=2000\n#         )\n    \n#         cov_matrix = np.identity(n) * sigma_squared_hat\n    \n#         p_val = p_value(A_obs, list_active_set, list_zk, etaj, z_obs, cov_matrix)\n        \n        \n#         p_values_dict[feature_name] = p_val\n#         elapsed_time = time.time() - start_time\n#         print(f\"    -> p-value = {p_val if p_val is not None else 'N/A'} (Thời gian: {elapsed_time:.2f}s)\")\n#         break\n        \n#     # --- GIAI ĐOẠN 3: PHÂN TÍCH KẾT QUẢ ---\n\n#     print(\"\\n--- Giai đoạn 3: Phân tích Kết quả Cuối cùng ---\")\n#     results_df = pd.DataFrame.from_dict(p_values_dict, orient='index', columns=['raw_p_value']).dropna()\n#     results_df.index.name = 'feature'\n#     results_df.sort_values('raw_p_value', inplace=True)\n\n#     if not results_df.empty:\n#         reject, p_adjusted, _, _ = multipletests(results_df['raw_p_value'], alpha=0.05, method='fdr_bh')\n#         results_df['adjusted_p_value'] = p_adjusted\n#         results_df['is_significant'] = reject\n        \n#         lasso_coef_df = pd.DataFrame({\n#             'feature': X_columns[A_obs],\n#             'lasso_coefficient': lasso_model.coef_[A_obs]\n#         })\n#         results_df = pd.merge(results_df, lasso_coef_df, left_index=True, right_on='feature').set_index('feature')\n#         results_df = results_df.sort_values('adjusted_p_value')\n\n#         print(\"\\nBảng kết quả Suy luận Chọn lọc:\")\n#         print(results_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T14:26:01.903079Z","iopub.execute_input":"2025-08-11T14:26:01.903382Z"}},"outputs":[],"execution_count":null}]}