{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceType":"competition","sourceId":71549,"databundleVersionId":8561470},{"sourceType":"modelInstanceVersion","sourceId":111114,"databundleVersionId":9559929,"modelInstanceId":85952},{"sourceType":"modelInstanceVersion","sourceId":100132,"databundleVersionId":9422626,"modelInstanceId":64905}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install pydicom timm torchio itk skorch open3d\nimport kagglehub\n\n# Download selected version\npath = kagglehub.model_download(\"vsahin/timm_3d_deps/other/initial/9\")\n\nprint(\"Path to model files:\", path)\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:25:54.412280Z","iopub.execute_input":"2024-11-14T05:25:54.412754Z","iopub.status.idle":"2024-11-14T05:26:50.761199Z","shell.execute_reply.started":"2024-11-14T05:25:54.412698Z","shell.execute_reply":"2024-11-14T05:26:50.760111Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%pip install --quiet /kaggle/input/timm_3d_deps/other/initial/9/pydicom/pydicom/pydicom-2.4.4-py3-none-any.whl\n%pip install timm_3d --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/timm_3d/\n%pip install torchio --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/torchio/\n%pip install itk --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/itk/itk\n%pip install skorch --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/skorch/skorch\n%pip install spacecutter --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/spacecutter/\n%pip install open3d --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/open3d","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:26:50.763060Z","iopub.execute_input":"2024-11-14T05:26:50.763509Z","iopub.status.idle":"2024-11-14T05:28:16.216289Z","shell.execute_reply.started":"2024-11-14T05:26:50.763465Z","shell.execute_reply":"2024-11-14T05:28:16.215130Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport os\nimport open3d as o3d\nfrom pydicom import dcmread\nimport math\nimport numpy as np\nimport cv2\nimport copy\nimport numpy as np\nfrom torch.utils.data import Dataset, DataLoader\nimport torchio as tio\nimport torch.nn as nn\nimport pydicom\nimport matplotlib.pyplot as plt\nimport glob \nimport torch\nimport torch.nn as nn\nimport timm_3d\nfrom spacecutter import *\nfrom spacecutter.losses import *\nfrom spacecutter.models import *\nfrom spacecutter.callbacks import *\nimport glob\nimport os\nimport torch\nfrom torch.cuda.amp import autocast\nimport time","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:16.217752Z","iopub.execute_input":"2024-11-14T05:28:16.218091Z","iopub.status.idle":"2024-11-14T05:28:25.338890Z","shell.execute_reply.started":"2024-11-14T05:28:16.218054Z","shell.execute_reply":"2024-11-14T05:28:25.338063Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_path = \"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/\"\ndef retrieve_test_data(data_path):\n    test_df = pd.read_csv(data_path + 'test_series_descriptions.csv')\n    print(\"Test data retrieved successfully.\")\n    return test_df\n\nretrieve_test_data(data_path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:25.340890Z","iopub.execute_input":"2024-11-14T05:28:25.341200Z","iopub.status.idle":"2024-11-14T05:28:25.364402Z","shell.execute_reply.started":"2024-11-14T05:28:25.341166Z","shell.execute_reply":"2024-11-14T05:28:25.363527Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def retrieve_image_paths(base_path, study_id, series_id):\n    series_dir = os.path.join(base_path, str(study_id), str(series_id))\n    images = os.listdir(series_dir)\n    image_paths = [os.path.join(series_dir, img) for img in images]\n    print(f\"Retrieved image paths for study_id: {study_id}, series_id: {series_id}.\")\n    return image_paths","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:25.365919Z","iopub.execute_input":"2024-11-14T05:28:25.366311Z","iopub.status.idle":"2024-11-14T05:28:25.371765Z","shell.execute_reply.started":"2024-11-14T05:28:25.366268Z","shell.execute_reply":"2024-11-14T05:28:25.370922Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Step 3: Read Study as Point Cloud Data\ndef read_study_as_pcd(dir_path, series_types_dict=None, downsampling_factor=1, img_size=(256, 256)):\n    pcd_overall = o3d.geometry.PointCloud()\n\n    for path in glob.glob(os.path.join(dir_path, \"**/*.dcm\"), recursive=True):\n        dicom_slice = dcmread(path)\n\n        series_id = os.path.basename(os.path.dirname(path))\n        study_id = os.path.basename(os.path.dirname(os.path.dirname(path)))\n        if series_types_dict is None or int(series_id) not in series_types_dict:\n            series_desc = dicom_slice.SeriesDescription\n        else:\n            series_desc = series_types_dict[int(series_id)]\n            series_desc = series_desc.split(\" \")[-1]\n\n        x_orig, y_orig = dicom_slice.pixel_array.shape\n        img = np.expand_dims(cv2.resize(dicom_slice.pixel_array, img_size, interpolation=cv2.INTER_AREA), -1)\n        x, y, z = np.where(img)\n\n        downsampling_factor_iter = max(downsampling_factor, int(math.ceil(len(x) / 6e6)))\n\n        index_voxel = np.vstack((x, y, z))[:, ::downsampling_factor_iter]\n        grid_index_array = index_voxel.T\n        pcd = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(grid_index_array.astype(np.float64)))\n\n        vals = np.expand_dims(img[x, y, z][::downsampling_factor_iter], -1)\n        if series_desc == \"T1\":\n            vals = np.pad(vals, ((0, 0), (0, 2)))\n        elif series_desc == \"T2\":\n            vals = np.pad(vals, ((0, 0), (1, 1)))\n        elif series_desc == \"T2/STIR\":\n            vals = np.pad(vals, ((0, 0), (2, 0)))\n        else:\n            raise ValueError(f\"Unknown series desc: {series_desc}\")\n\n        pcd.colors = o3d.utility.Vector3dVector(vals.astype(np.float64))\n\n        dX, dY = dicom_slice.PixelSpacing\n        dZ = dicom_slice.SliceThickness\n\n        X = np.array(list(dicom_slice.ImageOrientationPatient[:3]) + [0]) * dX\n        Y = np.array(list(dicom_slice.ImageOrientationPatient[3:]) + [0]) * dY\n\n        for z in range(int(dZ)):\n            pos = list(dicom_slice.ImagePositionPatient)\n            if series_desc == \"T2\":\n                pos[-1] += z\n            else:\n                pos[0] += z\n            S = np.array(pos + [1])\n\n            transform_matrix = np.array([X, Y, np.zeros(len(X)), S]).T\n            transform_matrix = transform_matrix @ np.matrix(\n                [[0, y_orig / img_size[1], 0, 0],\n                 [x_orig / img_size[0], 0, 0, 0],\n                 [0, 0, 1, 0],\n                 [0, 0, 0, 1]]\n            )\n\n            pcd_overall += copy.deepcopy(pcd).transform(transform_matrix)\n\n    return pcd_overall","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:25.373333Z","iopub.execute_input":"2024-11-14T05:28:25.374319Z","iopub.status.idle":"2024-11-14T05:28:25.391010Z","shell.execute_reply.started":"2024-11-14T05:28:25.374280Z","shell.execute_reply":"2024-11-14T05:28:25.390083Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def read_study_as_voxel_grid(dir_path, series_type_dict=None, downsampling_factor=1, img_size=(256, 256)):\n    pcd_overall = read_study_as_pcd(dir_path,\n                                    series_types_dict=series_type_dict,\n                                    downsampling_factor=downsampling_factor,\n                                    img_size=img_size)\n    box = pcd_overall.get_axis_aligned_bounding_box()\n\n    max_b = np.array(box.get_max_bound())\n    min_b = np.array(box.get_min_bound())\n\n    pts = (np.array(pcd_overall.points) - (min_b)) * (\n                (img_size[0] - 1, img_size[0] - 1, img_size[0] - 1) / (max_b - min_b))\n    coords = np.round(pts).astype(np.int32)\n    vals = np.array(pcd_overall.colors, dtype=np.float16)\n\n    grid = np.zeros((3, img_size[0], img_size[0], img_size[0]), dtype=np.float16)\n    indices = coords[:, 0], coords[:, 1], coords[:, 2]\n\n    np.maximum.at(grid[0], indices, vals[:, 0])\n    np.maximum.at(grid[1], indices, vals[:, 1])\n    np.maximum.at(grid[2], indices, vals[:, 2])\n\n    print(\"Study read as voxel grid successfully.\")\n    return grid","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:25.392202Z","iopub.execute_input":"2024-11-14T05:28:25.392492Z","iopub.status.idle":"2024-11-14T05:28:25.405775Z","shell.execute_reply.started":"2024-11-14T05:28:25.392461Z","shell.execute_reply":"2024-11-14T05:28:25.404943Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"CONDITIONS = {\n    \"Sagittal T2/STIR\": [\"Spinal Canal Stenosis\"],\n    \"Axial T2\": [\"Left Subarticular Stenosis\", \"Right Subarticular Stenosis\"],\n    \"Sagittal T1\": [\"Left Neural Foraminal Narrowing\", \"Right Neural Foraminal Narrowing\"],\n}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:25.406933Z","iopub.execute_input":"2024-11-14T05:28:25.407241Z","iopub.status.idle":"2024-11-14T05:28:25.415202Z","shell.execute_reply.started":"2024-11-14T05:28:25.407187Z","shell.execute_reply":"2024-11-14T05:28:25.414495Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class PatientLevelTestset(Dataset):\n    def __init__(self,\n                 base_path: str,\n                 dataframe: pd.DataFrame,\n                 transform_3d=None):\n        self.base_path = base_path\n\n        self.dataframe = (dataframe[['study_id', \"series_id\", \"series_description\"]]\n                          .drop_duplicates())\n\n        self.subjects = self.dataframe[['study_id']].drop_duplicates().reset_index(drop=True)\n        self.series_descs = {e[0]: e[1] for e in self.dataframe[[\"series_id\", \"series_description\"]].drop_duplicates().values}\n\n        self.transform_3d = transform_3d\n\n    def __len__(self):\n        return len(self.subjects)\n\n    def __getitem__(self, index):\n        curr = self.subjects.iloc[index]\n        study_path = os.path.join(self.base_path, str(curr[\"study_id\"]))\n\n        study_images = read_study_as_voxel_grid(study_path, self.series_descs)\n\n        if self.transform_3d is not None:\n            study_images = self.transform_3d(torch.FloatTensor(study_images))  # .data\n            return study_images.to(torch.half), str(curr[\"study_id\"])\n\n        return torch.HalfTensor(study_images), str(curr[\"study_id\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:25.416195Z","iopub.execute_input":"2024-11-14T05:28:25.416482Z","iopub.status.idle":"2024-11-14T05:28:25.433571Z","shell.execute_reply.started":"2024-11-14T05:28:25.416452Z","shell.execute_reply":"2024-11-14T05:28:25.432697Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"transform_3d = tio.Compose([\n    tio.RescaleIntensity([0, 1]),\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:25.436652Z","iopub.execute_input":"2024-11-14T05:28:25.436980Z","iopub.status.idle":"2024-11-14T05:28:25.443502Z","shell.execute_reply.started":"2024-11-14T05:28:25.436941Z","shell.execute_reply":"2024-11-14T05:28:25.442560Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def create_subject_level_testset_and_loader(df: pd.DataFrame,\n                                             transform_3d,\n                                             base_path: str,\n                                             batch_size=1,\n                                             num_workers=0):\n    testset = PatientLevelTestset(base_path, df, transform_3d=transform_3d)\n    test_loader = DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=num_workers)\n    print(\"Subject level testset and data loader created successfully.\")\n    return testset, test_loader","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:25.444820Z","iopub.execute_input":"2024-11-14T05:28:25.445458Z","iopub.status.idle":"2024-11-14T05:28:25.454170Z","shell.execute_reply.started":"2024-11-14T05:28:25.445423Z","shell.execute_reply":"2024-11-14T05:28:25.453022Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data = retrieve_test_data(data_path)\ndataset, dataloader = create_subject_level_testset_and_loader(data, transform_3d, os.path.join(data_path, \"test_images\"))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:25.455357Z","iopub.execute_input":"2024-11-14T05:28:25.455655Z","iopub.status.idle":"2024-11-14T05:28:25.481024Z","shell.execute_reply.started":"2024-11-14T05:28:25.455624Z","shell.execute_reply":"2024-11-14T05:28:25.480177Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"grid = dataset[0][0]\n\nfig, axs = plt.subplots(3, 3)\n\naxs[0, 0].imshow(grid[0, 128])\naxs[1, 0].imshow(grid[1, 128])\naxs[2, 0].imshow(grid[2, 128])\n\naxs[0, 1].imshow(grid[0, :, 128])\naxs[1, 1].imshow(grid[1, :, 128])\naxs[2, 1].imshow(grid[2, :, 128])\n\naxs[0, 2].imshow(grid[0, :, :, 128])\naxs[1, 2].imshow(grid[1, :, :, 128])\naxs[2, 2].imshow(grid[2, :, :, 128])\n\nplt.show()\nprint(\"Visualization completed.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:25.482194Z","iopub.execute_input":"2024-11-14T05:28:25.482980Z","iopub.status.idle":"2024-11-14T05:28:44.710746Z","shell.execute_reply.started":"2024-11-14T05:28:25.482936Z","shell.execute_reply":"2024-11-14T05:28:44.709769Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"device = torch.device(\"cuda\") if torch.cuda.is_available() else \"cpu\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:44.712167Z","iopub.execute_input":"2024-11-14T05:28:44.713054Z","iopub.status.idle":"2024-11-14T05:28:44.721308Z","shell.execute_reply.started":"2024-11-14T05:28:44.713005Z","shell.execute_reply":"2024-11-14T05:28:44.720353Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class CNN_Model_3D_Multihead(nn.Module):\n    def __init__(self,\n                 backbone=\"efficientnet_lite0\",\n                 in_chans=1,\n                 out_classes=5,\n                 cutpoint_margin=0.15,\n                 pretrained=False):\n        super(CNN_Model_3D_Multihead, self).__init__()\n        self.out_classes = out_classes\n\n        self.encoder = timm_3d.create_model(\n            backbone,\n            features_only=False,\n            drop_rate=0,\n            drop_path_rate=0,\n            pretrained=pretrained,\n            in_chans=in_chans,\n            global_pool=\"max\"\n        )\n        if \"efficientnet\" in backbone:\n            head_in_dim = self.encoder.classifier.in_features\n            self.encoder.classifier = nn.Sequential(\n                nn.LayerNorm(head_in_dim),\n                nn.Dropout(0),\n            )\n\n        elif \"vit\" in backbone:\n            self.encoder.head.drop = nn.Dropout(0)\n            head_in_dim = self.encoder.head.fc.in_features\n            self.encoder.head.fc = nn.Identity()\n\n        self.heads = nn.ModuleList(\n            [nn.Sequential(\n                nn.Linear(head_in_dim, 1),\n                LogisticCumulativeLink(3)\n            ) for i in range(out_classes)]\n        )\n\n        self.ascension_callback = AscensionCallback(margin=cutpoint_margin)\n\n    def forward(self, x):\n        feat = self.encoder(x)\n        return torch.swapaxes(torch.stack([head(feat) for head in self.heads]), 0, 1)\n\n    def _ascension_callback(self):\n        for head in self.heads:\n            self.ascension_callback.clip(head[-1])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:44.722647Z","iopub.execute_input":"2024-11-14T05:28:44.723287Z","iopub.status.idle":"2024-11-14T05:28:44.736234Z","shell.execute_reply.started":"2024-11-14T05:28:44.723241Z","shell.execute_reply":"2024-11-14T05:28:44.735299Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import kagglehub\n\n# Download selected version\npath = kagglehub.model_download(\"vsahin/rsna-2024/pyTorch/vit_voxel_v2/7\")\n\nprint(\"Path to model files:\", path)\nmodel = CNN_Model_3D_Multihead(backbone=\"maxvit_rmlp_tiny_rw_256\", in_chans=3, out_classes=25).to(device)\nmodel.load_state_dict(torch.load(\"/kaggle/input/rsna-2024/pytorch/vit_voxel_v2/7/maxvit_rmlp_tiny_rw_256_256_v2_fold_3_32.pt\"))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:28:44.737252Z","iopub.execute_input":"2024-11-14T05:28:44.737705Z","iopub.status.idle":"2024-11-14T05:28:47.063198Z","shell.execute_reply.started":"2024-11-14T05:28:44.737666Z","shell.execute_reply":"2024-11-14T05:28:47.062239Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"CONDITIONS = {\n    \"Sagittal T2/STIR\": [\"spinal_canal_stenosis\"],\n    \"Axial T2\": [\"left_subarticular_stenosis\", \"right_subarticular_stenosis\"],\n    \"Sagittal T1\": [\"left_neural_foraminal_narrowing\", \"right_neural_foraminal_narrowing\"],\n}\n\nALL_CONDITIONS = sorted([\"spinal_canal_stenosis\", \"left_subarticular_stenosis\", \"right_subarticular_stenosis\", \"left_neural_foraminal_narrowing\", \"right_neural_foraminal_narrowing\"])\nLEVELS = [\"l1_l2\", \"l2_l3\", \"l3_l4\", \"l4_l5\", \"l5_s1\"]\n\nresults_df = pd.DataFrame({\"row_id\":[], \"normal_mild\": [], \"moderate\": [], \"severe\": []})\n\nALL_CONDITIONS","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:29:13.240953Z","iopub.execute_input":"2024-11-14T05:29:13.241739Z","iopub.status.idle":"2024-11-14T05:29:13.250834Z","shell.execute_reply.started":"2024-11-14T05:29:13.241686Z","shell.execute_reply":"2024-11-14T05:29:13.249786Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"study_ids = glob.glob(\"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_images/*\")\nstudy_ids = [os.path.basename(e) for e in study_ids]\n\nresults_df = pd.DataFrame({\"row_id\":[], \"normal_mild\": [], \"moderate\": [], \"severe\": []})\nfor study_id in study_ids:\n    for condition in ALL_CONDITIONS:\n        for level in LEVELS:\n            row_id = f\"{study_id}_{condition}_{level}\"\n            results_df = results_df._append({\"row_id\": row_id, \"normal_mild\": 1/3, \"moderate\": 1/3, \"severe\": 1/3}, ignore_index=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:29:22.960610Z","iopub.execute_input":"2024-11-14T05:29:22.961479Z","iopub.status.idle":"2024-11-14T05:29:22.996985Z","shell.execute_reply.started":"2024-11-14T05:29:22.961432Z","shell.execute_reply":"2024-11-14T05:29:22.996249Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset.dataframe\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:29:29.756163Z","iopub.execute_input":"2024-11-14T05:29:29.756575Z","iopub.status.idle":"2024-11-14T05:29:29.766083Z","shell.execute_reply.started":"2024-11-14T05:29:29.756537Z","shell.execute_reply":"2024-11-14T05:29:29.765180Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Step 11: Make Predictions\nstart_time = time.time()\n\nwith torch.no_grad():\n    with autocast(dtype=torch.float16):\n        model.eval()\n\n        for images, study_id in dataloader:\n            output = model(images.to(device))\n            for i, batch_out in enumerate(output):\n                batch_out = output.cpu().numpy()[i]\n                for index, level in enumerate(batch_out):\n                    row_id = f\"{study_id[i]}_{ALL_CONDITIONS[index // 5]}_{LEVELS[index % 5]}\"\n                    results_df.loc[results_df.row_id == row_id,'normal_mild'] = level[0]\n                    results_df.loc[results_df.row_id == row_id,'moderate'] = level[1]\n                    results_df.loc[results_df.row_id == row_id,'severe'] = level[2]\n                \nprint(\"--- %s seconds ---\" % (time.time() - start_time))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:30:04.986647Z","iopub.execute_input":"2024-11-14T05:30:04.987053Z","iopub.status.idle":"2024-11-14T05:30:23.597901Z","shell.execute_reply.started":"2024-11-14T05:30:04.987014Z","shell.execute_reply":"2024-11-14T05:30:23.596812Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"results_df\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-14T05:30:28.147762Z","iopub.execute_input":"2024-11-14T05:30:28.148642Z","iopub.status.idle":"2024-11-14T05:30:28.163197Z","shell.execute_reply.started":"2024-11-14T05:30:28.148595Z","shell.execute_reply":"2024-11-14T05:30:28.162259Z"}},"outputs":[],"execution_count":null}]}