{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":45867,"databundleVersionId":6924515,"sourceType":"competition"},{"sourceId":6774400,"sourceType":"datasetVersion","datasetId":3895136},{"sourceId":7128234,"sourceType":"datasetVersion","datasetId":4110911},{"sourceId":7143890,"sourceType":"datasetVersion","datasetId":4123551},{"sourceId":7244340,"sourceType":"datasetVersion","datasetId":4144605},{"sourceId":7272145,"sourceType":"datasetVersion","datasetId":4209174}],"dockerImageVersionId":30626,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nfrom IPython.display import clear_output\n\nfrom PIL import Image \nImage.MAX_IMAGE_PIXELS = None \nimport pandas as pd\nimport numpy as np\nimport gc\nimport math\n\nfrom collections import Counter","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-12-25T09:15:34.928489Z","iopub.execute_input":"2023-12-25T09:15:34.929061Z","iopub.status.idle":"2023-12-25T09:15:37.848308Z","shell.execute_reply.started":"2023-12-25T09:15:34.929Z","shell.execute_reply":"2023-12-25T09:15:37.847216Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.layers import GlobalAveragePooling2D, Dense\nfrom tensorflow.keras.callbacks import ModelCheckpoint","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:15:37.850078Z","iopub.execute_input":"2023-12-25T09:15:37.850555Z","iopub.status.idle":"2023-12-25T09:15:51.149875Z","shell.execute_reply.started":"2023-12-25T09:15:37.850527Z","shell.execute_reply":"2023-12-25T09:15:51.148824Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch \nmodel_Net = torch.jit.load('/kaggle/input/stainnet/model_scripted.pt')","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:15:51.151238Z","iopub.execute_input":"2023-12-25T09:15:51.15194Z","iopub.status.idle":"2023-12-25T09:15:51.238772Z","shell.execute_reply.started":"2023-12-25T09:15:51.151906Z","shell.execute_reply":"2023-12-25T09:15:51.236678Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_Net.load_state_dict(torch.load(\"/kaggle/input/stainnet/StainNet-Public_layer3_ch32 (1).pth\",map_location=torch.device('cpu')))\nmodel_Net.eval()\n\ndef norm(image):\n    image = np.array(image).astype(np.float32)\n    image = image.transpose((2, 0, 1))\n    image = ((image / 255) - 0.5) / 0.5\n    image=image[np.newaxis, ...]\n    image=torch.from_numpy(image)\n    return image\n\ndef un_norm(image):\n    image = image.cpu().detach().numpy()[0]\n    image = ((image * 0.5 + 0.5) * 255).astype(np.uint8).transpose((1,2,0))\n    return image\n\ndef stain_normalize1(source, verbose=False):\n    with torch.no_grad():\n        img_net=model_Net(norm(source))\n        img_net=un_norm(img_net)\n        if verbose: plt.imshow(img_net); plt.show()\n        return img_net","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:15:51.241421Z","iopub.execute_input":"2023-12-25T09:15:51.24188Z","iopub.status.idle":"2023-12-25T09:15:51.282507Z","shell.execute_reply.started":"2023-12-25T09:15:51.241842Z","shell.execute_reply":"2023-12-25T09:15:51.280492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls /kaggle/input/pyvips-python-and-deb-package\n# intall the deb packages\n!yes | dpkg -i --force-depends /kaggle/input/pyvips-python-and-deb-package/linux_packages/archives/*.deb\n# install the python wrapper\n!pip install pyvips -f /kaggle/input/pyvips-python-and-deb-package/python_packages/ --no-index\n!pip list | grep pyvips\n\n\nfrom IPython import display\ndisplay.clear_output()","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:15:51.286046Z","iopub.execute_input":"2023-12-25T09:15:51.28643Z","iopub.status.idle":"2023-12-25T09:17:23.90286Z","shell.execute_reply.started":"2023-12-25T09:15:51.286375Z","shell.execute_reply":"2023-12-25T09:17:23.901482Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMAGE_SIZE = [224, 224] # at this size, a GPU will run out of memory. Use the TPU\nEPOCHS = 10\nBATCH_SIZE = 32 \n\nNUM_TRAINING_IMAGES = 500000\nNUM_TEST_IMAGES = 7382\nSTEPS_PER_EPOCH = NUM_TRAINING_IMAGES // BATCH_SIZE\nAUTO = tf.data.experimental.AUTOTUNE\nprint(STEPS_PER_EPOCH)","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:23.907555Z","iopub.execute_input":"2023-12-25T09:17:23.908025Z","iopub.status.idle":"2023-12-25T09:17:23.91602Z","shell.execute_reply.started":"2023-12-25T09:17:23.907994Z","shell.execute_reply":"2023-12-25T09:17:23.914523Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os, glob\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport re\n\nDATASET_FOLDER = \"/kaggle/input/UBC-OCEAN/\"\nIMAGES_FOLDER = \"/kaggle/working/test_tiles\"\n\nos.environ['VIPS_CONCURRENCY'] = '4'\nos.environ['VIPS_DISC_THRESHOLD'] = '15gb'\nimport torch\nfrom PIL import Image\nfrom torch.utils.data import Dataset","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:23.917626Z","iopub.execute_input":"2023-12-25T09:17:23.917982Z","iopub.status.idle":"2023-12-25T09:17:23.935165Z","shell.execute_reply.started":"2023-12-25T09:17:23.917953Z","shell.execute_reply":"2023-12-25T09:17:23.934379Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport pyvips\nimport numpy as np\nimport random\nfrom PIL import Image\nfrom IPython import display\nfrom tqdm import tqdm\ndef extract_image_tiles(\n    p_img,label, folder, size: int = 2048, scale: float = 0.5,\n    drop_thr: float = 0.6, white_thr: int = 240, max_samples: int = 50\n) -> list:\n    name, _ = os.path.splitext(os.path.basename(p_img))\n    im = pyvips.Image.new_from_file(p_img)\n    w = h = size\n    print(f\"processing: {p_img}\")\n    # https://stackoverflow.com/a/47581978/4521646\n    idxs = [(y, y + h, x, x + w) for y in range(0, im.height, h) for x in range(0, im.width, w)]\n    # random subsample\n    max_samples = max_samples if isinstance(max_samples, int) else int(len(idxs) * max_samples)\n    random.shuffle(idxs)\n    files = []\n    imageeslist=[]\n    for y, y_, x, x_ in idxs:        # https://libvips.github.io/pyvips/vimage.html#pyvips.Image.crop\n\n    #for y, y_, x, x_ in tqdm(idxs, total=len(idxs)):        # https://libvips.github.io/pyvips/vimage.html#pyvips.Image.crop\n        tile = im.crop(x, y, min(w, im.width - x), min(h, im.height - y)).numpy()[..., :3]\n        if tile.shape[:2] != (h, w):\n            tile_ = tile\n            tile_size = (h, w) if tile.ndim == 2 else (h, w, tile.shape[2])\n            tile = np.zeros(tile_size, dtype=tile.dtype)\n            tile[:tile_.shape[0], :tile_.shape[1], ...] = tile_\n        black_bg = np.sum(tile, axis=2) == 0\n        tile[black_bg, :] = 255\n        img = np.dot(tile[..., :3], [0.2989, 0.5870, 0.1140]).astype(np.uint8)\n        white_pixels = np.sum(img>220)\n#         mask_bg = np.mean(tile, axis=2) > white_thr\n        if np.sum(white_pixels) >= (np.prod(img.shape) * drop_thr):\n#             display.clear_output()\n#             plt.imshow(tile)\n#             plt.show()\n            continue\n#         imageeslist.append(tile)\n        p_img = os.path.join(folder, f\"label-{label}-{int(x_ / w)}-{int(y_ / h)}.png\")\n#         # print(tile.shape, tile.dtype, tile.min(), tile.max())\n# #         new_size = int(size * scale), int(size * scale)\n#          #Image.fromarray(tile).resize(new_size, Image.LANCZOS).save(p_img)\n        Image.fromarray(tile).save(p_img)\n\n        files.append(p_img)\n#         # need to set counter check as some empty tiles could be skipped earlier\n        if len(files) >= max_samples:\n            break\n    return files","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:23.938128Z","iopub.execute_input":"2023-12-25T09:17:23.938769Z","iopub.status.idle":"2023-12-25T09:17:24.203099Z","shell.execute_reply.started":"2023-12-25T09:17:23.938726Z","shell.execute_reply":"2023-12-25T09:17:24.201915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def extract_prune_tiles(\n    path_img: str,label:str, folder: str, size: int = 2048, scale: float = 0.25,\n    drop_thr: float = 0.6,white_thr: int=0.5, max_samples: int = 1000\n) -> str:\n    folder=\"/kaggle/working/test_tiles\"\n    print(f\"processing: {path_img}\")\n    name, _ = os.path.splitext(os.path.basename(path_img))\n  \n    os.makedirs(folder, exist_ok=True)\n    tiles = extract_image_tiles(\n        path_img,label, folder, size=size, scale=scale,\n        drop_thr=drop_thr,white_thr=225 ,max_samples=max_samples)\n    return tiles","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:24.20659Z","iopub.execute_input":"2023-12-25T09:17:24.20701Z","iopub.status.idle":"2023-12-25T09:17:24.216312Z","shell.execute_reply.started":"2023-12-25T09:17:24.206977Z","shell.execute_reply":"2023-12-25T09:17:24.214272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df=pd.read_csv('/kaggle/input/UBC-OCEAN/train.csv')\ntest_df=pd.read_csv('/kaggle/input/UBC-OCEAN/test.csv')\n# submission_df = pd.read_csv(\"/kaggle/input/UBC-OCEAN/sample_submission.csv\")\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:24.218423Z","iopub.execute_input":"2023-12-25T09:17:24.218824Z","iopub.status.idle":"2023-12-25T09:17:24.248713Z","shell.execute_reply.started":"2023-12-25T09:17:24.21879Z","shell.execute_reply":"2023-12-25T09:17:24.246987Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import pandas as pd\n# full_df=pd.read_csv(\"/kaggle/input/UBC-OCEAN/train.csv\")\n# full_df=full_df[full_df[\"is_tma\"]==True]\n# test_df=full_df.sample(10)\n# test_df.head(10)","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:24.250049Z","iopub.execute_input":"2023-12-25T09:17:24.250349Z","iopub.status.idle":"2023-12-25T09:17:24.267919Z","shell.execute_reply.started":"2023-12-25T09:17:24.250321Z","shell.execute_reply":"2023-12-25T09:17:24.266768Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#  model=tf.keras.applications.EfficientNetB2(\n#     include_top=True,\n#     weights=None,\n#     input_tensor=None,\n#     input_shape=None,\n#     pooling=None,\n#     classes=5,\n#     classifier_activation=\"softmax\",\n    \n# )\n# model.load_weights(\"/kaggle/input/1080p-models-effbo/withpreprocessinputws1tobesub.h5\")","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:24.26907Z","iopub.execute_input":"2023-12-25T09:17:24.270143Z","iopub.status.idle":"2023-12-25T09:17:24.274928Z","shell.execute_reply.started":"2023-12-25T09:17:24.270077Z","shell.execute_reply":"2023-12-25T09:17:24.273895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model_path =\"/kaggle/input/effb2-tf-1024-training/o.6effv2.keras\"\n# model=tf.keras.models.load_model(model_path)","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:24.276172Z","iopub.execute_input":"2023-12-25T09:17:24.277281Z","iopub.status.idle":"2023-12-25T09:17:24.294072Z","shell.execute_reply.started":"2023-12-25T09:17:24.277215Z","shell.execute_reply":"2023-12-25T09:17:24.292811Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n   \n# pretrained_model = EfficientNetB0( weights=,include_top=False, input_shape=(256,256, 3))\n    \n#     # Freeze the layers of the pre-trained model for transfer learning\n# pretrained_model.trainable = True\n    \n#     # Build your model using the EfficientNetB0 base\n# model = tf.keras.Sequential([\n#         pretrained_model,\n#         GlobalAveragePooling2D(),\n#         Dense(5)  # Assuming you have 6 classes\n#     ])\n        \n        \n# checkpoint_callback = ModelCheckpoint(filepath='weights.{epoch:02d}-{batch:04d}.h5', save_freq=10000)\n# model.compile(\n#         optimizer=tf.keras.optimizers.Adam(),\n#         loss='sparse_categorical_crossentropy',\n#         metrics=['sparse_categorical_accuracy']\n#     )\nmodel_path =\"/kaggle/input/1080p-models-effbo/withpreprocessinputws1tobesub.h5\"\nmodel=tf.keras.models.load_model(model_path)\n\nmodel_2path=\"/kaggle/input/1080p-models-effbo/tma_yoloepoch26.pt\"\nmodel2= torch.jit.load(model_2path)\n\nmodel3=\"/kaggle/input/effb2-tf-1024-training/effv255valepoch8.keras\"\n\nmodel4=\"/kaggle/input/1080p-models-effbo/weights.09-0752.h5\"\n\n# Set the model to evaluation mode (important for inference)\nmodel2.eval()\n\n# Perform inference using the loaded model\n# input_data = torch.randn(1, 10)  # Use the appropriate input data\n\n# historical = model.fit(training_dataset, \n#                        steps_per_epoch=STEPS_PER_EPOCH, \n#                        epochs=EPOCHS,\n#                        callbacks=[checkpoint_callback])\ndisplay.clear_output()","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:24.298027Z","iopub.execute_input":"2023-12-25T09:17:24.299051Z","iopub.status.idle":"2023-12-25T09:17:29.742525Z","shell.execute_reply.started":"2023-12-25T09:17:24.299019Z","shell.execute_reply":"2023-12-25T09:17:29.741075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:29.74384Z","iopub.execute_input":"2023-12-25T09:17:29.744143Z","iopub.status.idle":"2023-12-25T09:17:29.7938Z","shell.execute_reply.started":"2023-12-25T09:17:29.744117Z","shell.execute_reply":"2023-12-25T09:17:29.791994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torchvision import transforms\n\ntransform =transforms.Compose([\n    transforms.Resize((224,224)),  # Resize to the required input size\n      # Crop the center part\n    transforms.ToTensor(),  # Convert to PyTorch tensor\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # Normalize with ImageNet stats\n])","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:29.795347Z","iopub.execute_input":"2023-12-25T09:17:29.796566Z","iopub.status.idle":"2023-12-25T09:17:30.109797Z","shell.execute_reply.started":"2023-12-25T09:17:29.796511Z","shell.execute_reply":"2023-12-25T09:17:30.10843Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import shutil\nimport os\nfrom tensorflow.keras.applications.efficientnet import preprocess_input\n\nimagelist=[]\nnewlist=[]\nanswer=[]\n\n\ndef extract_features_torch(image):\n\n    \n    image=stain_normalize1(image)\n    image = Image.fromarray(image)\n#     image=np.squeeze(image)\n    image=transform(image)\n    image= torch.unsqueeze(image, axis=0) \n   \n    model2.eval()\n   \n    with torch.no_grad():\n        result=model2(image)\n    return result.numpy()\n  \n\ndef extract_features(tf_image):\n   \n    tf_image=stain_normalize1(tf_image)\n    tf_image= np.expand_dims(tf_image, axis=0)\n    tf_image = tf.image.resize(tf_image, [224, 224])\n    tf_image = tf.cast(tf_image, tf.float32)\n    image=preprocess_input(tf_image)\n    result=model.predict(tf_image,verbose=0)\n    \n        \n#         probabilities = torch.nn.functional.softmax(output, dim=1)  # Apply softmax\n        \n    return result\n\n\nfor idx,row in test_df.iterrows():\n    \n    desired_path=f\"/kaggle/input/UBC-OCEAN/test_images/{row['image_id']}.png\"\n    if os.path.exists(desired_path):\n        path = desired_path\n    else:\n        path=f\"/kaggle/input/UBC-OCEAN/test_thumbnails/{row['image_id']}.png\"\n        #path=f\"/kaggle/input/UBC-OCEAN/train_images/{row['image_id']}.png\"\n    label=row['image_id']\n    if row['image_width']<6000 or row[\"image_height\"]<6000:\n        print(\"inside tma \")\n\n        imagees_list=extract_prune_tiles( path,label, IMAGES_FOLDER, size=1024, scale=1,drop_thr=0.7,white_thr=222,max_samples=10)\n        \n        print(\"images finished processing\")\n        results=[] \n        print(\"inside tma \",len(imagees_list))\n        for idx1 in range(len(imagees_list)):\n                imagepath=imagees_list[idx1]\n                image=np.array(Image.open(imagepath))\n                  # Add batch dimension\n#                 image_array = image_array.astype(np.float32)\n\n                probabilities = extract_features_torch(image)\n\n                result=np.argmax(probabilities)\n                results.append(int(result))\n\n    else:\n        imagees_list=extract_prune_tiles( path,label, IMAGES_FOLDER, size=1024, scale=1,drop_thr=0.4,white_thr=222,max_samples=10)\n    \n\n        print(\"images finished processing\",imagees_list)\n        results=[] \n        for idx1 in range(len(imagees_list)):\n                imagepath=imagees_list[idx1]\n                image=np.array(Image.open(imagepath))\n#                 image= np.expand_dims(image, axis=0)  # Add batch dimension\n#                 image_array = image_array.astype(np.float32)\n\n                probabilities = extract_features(image)\n\n                result=np.argmax(probabilities)\n                results.append(int(result))\n         \n    rmpath=glob.glob(\"/kaggle/working/test_tiles/*.png\")\n    if len(rmpath)>0:\n        [ os.remove(rmpathone) for rmpathone in rmpath]\n    else:\n        print(\"file not found\")       \n    if len(results)<1:\n        results=[2,2,2,2,2]        \n    element_counts = Counter(results)\n    most_common_element = element_counts.most_common(1)[0][0]\n    answer.append(most_common_element)\n    imagelist.append(row['image_id'])\n\n#     newlist.append(new_data)\n#     if idx > 3:\n#         break\n\n \nnew_data = {\n             'image_id': imagelist,\n             'label': answer\n                    }  \n  \nsubmission_df= pd.DataFrame(new_data)\nlabel_to_be_replace=['CC','EC','HGSC','LGSC','MC','Others']\nlabel_to_be_replaced=[0,1,2,3,4,5]\nsubmission_df['label'].replace(label_to_be_replaced,label_to_be_replace,inplace=True)\n        # Save the DataFrame to a CSV file named 'submission.csv'\nsubmission_df.to_csv('submission.csv', index=False)\n        \n        # Print the DataFrame\nprint(submission_df)","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:20:50.820533Z","iopub.execute_input":"2023-12-25T09:20:50.820931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"    model=tf.keras.applications.EfficientNetB2(\n    include_top=True,\n    weights=None,\n    input_tensor=None,\n    input_shape=None,\n    pooling=None,\n    classes=5,\n    classifier_activation=\"softmax\",\n    \n)\n","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:30.851608Z","iopub.status.idle":"2023-12-25T09:17:30.851961Z","shell.execute_reply.started":"2023-12-25T09:17:30.851799Z","shell.execute_reply":"2023-12-25T09:17:30.851814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.load_weights(model_path, by_name=True)\n\n# Print the summary of the model, including the weights\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:30.853528Z","iopub.status.idle":"2023-12-25T09:17:30.853827Z","shell.execute_reply.started":"2023-12-25T09:17:30.853692Z","shell.execute_reply":"2023-12-25T09:17:30.853705Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model_path = \"/kaggle/input/effb2-tf-1024-training/o.6effv2.keras\"\n# # model_on_cpu = tf.distribute.cluster_resolver.TPUClusterResolver()\n\n\n# # Load the weights into the new model\n# model.load_weights(model_path)","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:30.854764Z","iopub.status.idle":"2023-12-25T09:17:30.855042Z","shell.execute_reply.started":"2023-12-25T09:17:30.854909Z","shell.execute_reply":"2023-12-25T09:17:30.854922Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import tensorflow as tf\n\n# # Replace with the actual path to your saved model file\n# model_path = \"/kaggle/input/effb2-tf-1024-training/o.6effv2.keras\"\n\n# # Load the pre-trained EfficientNetB2 model\n# model5 = tf.keras.models.load_model(model_path)\n\n# # Print the summary of the model, including the weights\n# model5.summary()\n\n# # Alternatively, you can print the weights of each layer\n# for layer in model5.layers:\n#     print(f\"Layer: {layer.name}\")\n#     for weight in layer.weights:\n#         print(f\"  {weight.name} shape: {weight.shape}\")\n","metadata":{"execution":{"iopub.status.busy":"2023-12-25T09:17:30.856162Z","iopub.status.idle":"2023-12-25T09:17:30.856451Z","shell.execute_reply.started":"2023-12-25T09:17:30.856301Z","shell.execute_reply":"2023-12-25T09:17:30.856314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}