{ "cells": [ { "cell_type": "markdown", "id": "58c9aafb", "metadata": {}, "source": [ "# Rhythmicity Perturbation using GeneRhythm\n", "This tutorial provides a step-by-step guide on performing inference, analysis, and perturbation of gene expression rhythmicity in a single dataset using GeneRhythm. We demonstrate the diverse capabilities of GeneRhythm by applying it to scRNA-seq data obtained from human PDAC samples.\n", "\n", "GeneRhythm leverages user-provided gene expression data by integrating wavelet transformation with deep generative modeling. This approach enables the extraction of frequency-domain features that complement traditional time-domain analyses, allowing for a more comprehensive understanding of gene expression dynamics. " ] }, { "cell_type": "code", "execution_count": 1, "id": "d5d4797e", "metadata": {}, "outputs": [], "source": [ "import subprocess\n", "from Build_graph import *\n", "from Frequency_extract import *\n", "from GCN_VAE import *\n", "from Perturbation import *\n", "from Show_result import *" ] }, { "cell_type": "markdown", "id": "07a449c4", "metadata": {}, "source": [ "# Part 1: Data loading, time and frequency information acquisition\n", "## Obtain time information with monocle3\n", "GeneRhythm firstly utilized monocle3 to obtain the trajectory information of single-cell RNA-seq data. trajectory_inference.R is the script to run monocle3. dataset indicated the name of dataset. mtx, barcode and gene indicate the position of the single-cell RNA-seq data.Based on the trajectory information, GeneRhythm can derive time information (Gene expression chagnes on the trajectory pesodu-time path)." ] }, { "cell_type": "code", "execution_count": 2, "id": "f95cc183", "metadata": {}, "outputs": [], "source": [ "dataset = 'PDAC'\n", "mtx = './dataset/PDAC/matrix.mtx'\n", "barcode = './dataset/PDAC/barcodes.csv'\n", "gene = './dataset/PDAC/features.csv'\n", "subprocess.run([\"Rscript\", \"trajectory_inference.R\", dataset, mtx, barcode, gene])" ] }, { "cell_type": "code", "execution_count": 3, "id": "8c9ba1ea-e7a1-4b82-89b7-51e7dcac83a4", "metadata": {}, "outputs": [], "source": [ "dataset = 'PDAC_Disease'\n", "mtx = './dataset/PDAC_Disease/matrix.mtx'\n", "barcode = './dataset/PDAC_Disease/barcodes.csv'\n", "gene = './dataset/PDAC_Disease/features.csv'\n", "subprocess.run([\"Rscript\", \"trajectory_inference.R\", dataset, mtx, barcode, gene])" ] }, { "cell_type": "code", "execution_count": 4, "id": "323c1683-2de0-49b4-9219-a6178ae7763e", "metadata": {}, "outputs": [], "source": [ "dataset = 'PDAC_Control'\n", "mtx = './dataset/PDAC_Control/matrix.mtx'\n", "barcode = './dataset/PDAC_Control/barcodes.csv'\n", "gene = './dataset/PDAC_Control/features.csv'\n", "subprocess.run([\"Rscript\", \"trajectory_inference.R\", dataset, mtx, barcode, gene])" ] }, { "cell_type": "markdown", "id": "f9ae3d69", "metadata": {}, "source": [ "## Frequency information generation\n", "In this step, we harness the power of wavelet transformation to extract detailed frequency information from the gene expression data. By leveraging the trajectory information obtained from Monocle3—which orders cells along a pseudotime axis—we can capture both the temporal progression and the underlying periodic patterns of gene expression.\n", "\n", "Wavelet transformation decomposes the gene expression profiles into various frequency components, enabling us to detect subtle oscillations and rhythmic behaviors that are often not apparent in the time domain alone. This multi-scale analysis helps reveal hidden periodicities and enriches our understanding of gene regulatory mechanisms.\n", "\n", "By integrating the frequency-domain features with the temporal trajectory and expression, we achieve a more nuanced analysis. The frequency information complements the time-domain data, enhancing gene clustering. Ultimately, this combined approach provides a comprehensive view of the dynamic changes in gene expression, paving the way for deeper insights into cellular functions and regulatory processes." ] }, { "cell_type": "code", "execution_count": 5, "id": "8dad2426", "metadata": {}, "outputs": [], "source": [ "trajectory_info = pd.read_csv(\"PDAC.csv\")\n", "mtx = sc.read_mtx(mtx)\n", "mtx = mtx.X.T\n", "barcode = pd.read_csv(barcode,sep=',',index_col=0)\n", "gene = pd.read_csv(gene,header=0,index_col = 0)\n", "adata = anndata.AnnData(mtx,barcode,gene)\n", "frequency_extract(trajectory_info, adata, dataset)" ] }, { "cell_type": "markdown", "id": "7536fa08-1818-4641-a54b-b77a754e2556", "metadata": {}, "source": [ "# Part 2: Model preparation and training\n", "## GCN graph preparation\n", "In this phase, we utilize the Mippie PPI database to extract gene-gene interaction information, thereby constructing the graph structure for our Graph Convolutional Network (GCN). Specifically, the database provides gene interaction data that has been validated by both experimental evidence and computational predictions. We treat these interactions as edges in the graph, with each gene represented as a node. By integrating this biologically informed network structure with the previously obtained gene expression and frequency information, the GCN model is better equipped to capture the regulatory relationships and functional synergies between genes. This integration ultimately enhances the accuracy and interpretability of gene clustering and biomarker identification during model training." ] }, { "cell_type": "code", "execution_count": 6, "id": "c948a441", "metadata": {}, "outputs": [], "source": [ "gene_id = gene.index.to_list()\n", "pd.Series(gene_id).to_csv(\n", " 'PDAC.txt',\n", " index=False,\n", " header=False\n", ")\n", "!java -jar HIPPIE_NC.jar -i=./PDAC.txt -t=e -o=out_PDAC.txt -s=0.5\n", "graph_df = pd.read_csv('out_PDAC.txt', sep='\\t', header=None)\n", "build_graph_mouse(graph_df,gene_info)" ] }, { "cell_type": "markdown", "id": "ce3e444d", "metadata": {}, "source": [ "## Modle training\n", "In this stage, the model is trained using time, frequency, and expression data, along with the previously constructed graph. This integration allows the model to learn a comprehensive latent embedding that encapsulates the intricate relationships among genes. Once the model has been trained, we apply the Leiden algorithm to the latent space to identify gene clusters. These clusters represent groups of genes with similar expression dynamics and regulatory patterns, providing a valuable basis for further biological insights and downstream analysis." ] }, { "cell_type": "code", "execution_count": 7, "id": "c6a26b74-879f-451d-beff-45e443d13728", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "____________________________\n", "Start Training VAE...\n", "torch.Size([1976, 250])\n", "Epochs: 1, AvgLoss: 61.1784\n", "torch.Size([1976, 250])\n", "Epochs: 2, AvgLoss: 61.0733\n", "torch.Size([1976, 250])\n", "Epochs: 3, AvgLoss: 60.9595\n", "torch.Size([1976, 250])\n", "Epochs: 4, AvgLoss: 60.8456\n", "torch.Size([1976, 250])\n", "Epochs: 5, AvgLoss: 60.7324\n", "torch.Size([1976, 250])\n", "Epochs: 6, AvgLoss: 60.6032\n", "torch.Size([1976, 250])\n", "Epochs: 7, AvgLoss: 60.4694\n", "torch.Size([1976, 250])\n", "Epochs: 8, AvgLoss: 60.3244\n", "torch.Size([1976, 250])\n", "Epochs: 9, AvgLoss: 60.1658\n", "torch.Size([1976, 250])\n", "Epochs: 10, AvgLoss: 59.9907\n", "torch.Size([1976, 250])\n", "Epochs: 11, AvgLoss: 59.8120\n", "torch.Size([1976, 250])\n", "Epochs: 12, AvgLoss: 59.6022\n", "torch.Size([1976, 250])\n", "Epochs: 13, AvgLoss: 59.3655\n", "torch.Size([1976, 250])\n", "Epochs: 14, AvgLoss: 59.0947\n", "torch.Size([1976, 250])\n", "Epochs: 15, AvgLoss: 58.8603\n", "torch.Size([1976, 250])\n", "Epochs: 16, AvgLoss: 58.5570\n", "torch.Size([1976, 250])\n", "Epochs: 17, AvgLoss: 58.2088\n", "torch.Size([1976, 250])\n", "Epochs: 18, AvgLoss: 57.8403\n", "torch.Size([1976, 250])\n", "Epochs: 19, AvgLoss: 57.4095\n", "torch.Size([1976, 250])\n", "Epochs: 20, AvgLoss: 56.9473\n", "torch.Size([1976, 250])\n", "Epochs: 21, AvgLoss: 56.4384\n", "torch.Size([1976, 250])\n", "Epochs: 22, AvgLoss: 55.7959\n", "torch.Size([1976, 250])\n", "Epochs: 23, AvgLoss: 55.2494\n", "torch.Size([1976, 250])\n", "Epochs: 24, AvgLoss: 54.6328\n", "torch.Size([1976, 250])\n", "Epochs: 25, AvgLoss: 53.8704\n", "torch.Size([1976, 250])\n", "Epochs: 26, AvgLoss: 53.0100\n", "torch.Size([1976, 250])\n", "Epochs: 27, AvgLoss: 52.3167\n", "torch.Size([1976, 250])\n", "Epochs: 28, AvgLoss: 51.2830\n", "torch.Size([1976, 250])\n", "Epochs: 29, AvgLoss: 50.4395\n", "torch.Size([1976, 250])\n", "Epochs: 30, AvgLoss: 49.4568\n", "torch.Size([1976, 250])\n", "Epochs: 31, AvgLoss: 48.5318\n", "torch.Size([1976, 250])\n", "Epochs: 32, AvgLoss: 47.5376\n", "torch.Size([1976, 250])\n", "Epochs: 33, AvgLoss: 46.5704\n", "torch.Size([1976, 250])\n", "Epochs: 34, AvgLoss: 45.7372\n", "torch.Size([1976, 250])\n", "Epochs: 35, AvgLoss: 44.8579\n", "torch.Size([1976, 250])\n", "Epochs: 36, AvgLoss: 44.0273\n", "torch.Size([1976, 250])\n", "Epochs: 37, AvgLoss: 43.4041\n", "torch.Size([1976, 250])\n", "Epochs: 38, AvgLoss: 42.6524\n", "torch.Size([1976, 250])\n", "Epochs: 39, AvgLoss: 42.0832\n", "torch.Size([1976, 250])\n", "Epochs: 40, AvgLoss: 41.5959\n", "torch.Size([1976, 250])\n", "Epochs: 41, AvgLoss: 41.0062\n", "torch.Size([1976, 250])\n", "Epochs: 42, AvgLoss: 40.6444\n", "torch.Size([1976, 250])\n", "Epochs: 43, AvgLoss: 40.2739\n", "torch.Size([1976, 250])\n", "Epochs: 44, AvgLoss: 39.8611\n", "torch.Size([1976, 250])\n", "Epochs: 45, AvgLoss: 39.4116\n", "torch.Size([1976, 250])\n", "Epochs: 46, AvgLoss: 39.2223\n", "torch.Size([1976, 250])\n", "Epochs: 47, AvgLoss: 38.9917\n", "torch.Size([1976, 250])\n", "Epochs: 48, AvgLoss: 38.7184\n", "torch.Size([1976, 250])\n", "Epochs: 49, AvgLoss: 38.6470\n", "torch.Size([1976, 250])\n", "Epochs: 50, AvgLoss: 38.4546\n", "torch.Size([1976, 250])\n", "Epochs: 51, AvgLoss: 38.2534\n", "torch.Size([1976, 250])\n", "Epochs: 52, AvgLoss: 38.2026\n", "torch.Size([1976, 250])\n", "Epochs: 53, AvgLoss: 38.0252\n", "torch.Size([1976, 250])\n", "Epochs: 54, AvgLoss: 37.9663\n", "torch.Size([1976, 250])\n", "Epochs: 55, AvgLoss: 37.9397\n", "torch.Size([1976, 250])\n", "Epochs: 56, AvgLoss: 37.8507\n", "torch.Size([1976, 250])\n", "Epochs: 57, AvgLoss: 37.8251\n", "torch.Size([1976, 250])\n", "Epochs: 58, AvgLoss: 37.7365\n", "torch.Size([1976, 250])\n", "Epochs: 59, AvgLoss: 37.6874\n", "torch.Size([1976, 250])\n", "Epochs: 60, AvgLoss: 37.6890\n", "torch.Size([1976, 250])\n", "Epochs: 61, AvgLoss: 37.6402\n", "torch.Size([1976, 250])\n", "Epochs: 62, AvgLoss: 37.5960\n", "torch.Size([1976, 250])\n", "Epochs: 63, AvgLoss: 37.5748\n", "torch.Size([1976, 250])\n", "Epochs: 64, AvgLoss: 37.5459\n", "torch.Size([1976, 250])\n", "Epochs: 65, AvgLoss: 37.4876\n", "torch.Size([1976, 250])\n", "Epochs: 66, AvgLoss: 37.4533\n", "torch.Size([1976, 250])\n", "Epochs: 67, AvgLoss: 37.3590\n", "torch.Size([1976, 250])\n", "Epochs: 68, AvgLoss: 37.2756\n", "torch.Size([1976, 250])\n", "Epochs: 69, AvgLoss: 37.2858\n", "torch.Size([1976, 250])\n", "Epochs: 70, AvgLoss: 37.2780\n", "torch.Size([1976, 250])\n", "Epochs: 71, AvgLoss: 37.1926\n", "torch.Size([1976, 250])\n", "Epochs: 72, AvgLoss: 37.1021\n", "torch.Size([1976, 250])\n", "Epochs: 73, AvgLoss: 37.0240\n", "torch.Size([1976, 250])\n", "Epochs: 74, AvgLoss: 37.0773\n", "torch.Size([1976, 250])\n", "Epochs: 75, AvgLoss: 37.0507\n", "torch.Size([1976, 250])\n", "Epochs: 76, AvgLoss: 37.0273\n", "torch.Size([1976, 250])\n", "Epochs: 77, AvgLoss: 36.9721\n", "torch.Size([1976, 250])\n", "Epochs: 78, AvgLoss: 36.8884\n", "torch.Size([1976, 250])\n", "Epochs: 79, AvgLoss: 36.8808\n", "torch.Size([1976, 250])\n", "Epochs: 80, AvgLoss: 36.8230\n", "torch.Size([1976, 250])\n", "Epochs: 81, AvgLoss: 36.7170\n", "torch.Size([1976, 250])\n", "Epochs: 82, AvgLoss: 36.7805\n", "torch.Size([1976, 250])\n", "Epochs: 83, AvgLoss: 36.7292\n", "torch.Size([1976, 250])\n", "Epochs: 84, AvgLoss: 36.7329\n", "torch.Size([1976, 250])\n", "Epochs: 85, AvgLoss: 36.6036\n", "torch.Size([1976, 250])\n", "Epochs: 86, AvgLoss: 36.6161\n", "torch.Size([1976, 250])\n", "Epochs: 87, AvgLoss: 36.5348\n", "torch.Size([1976, 250])\n", "Epochs: 88, AvgLoss: 36.5202\n", "torch.Size([1976, 250])\n", "Epochs: 89, AvgLoss: 36.4723\n", "torch.Size([1976, 250])\n", "Epochs: 90, AvgLoss: 36.4672\n", "torch.Size([1976, 250])\n", "Epochs: 91, AvgLoss: 36.3867\n", "torch.Size([1976, 250])\n", "Epochs: 92, AvgLoss: 36.3737\n", "torch.Size([1976, 250])\n", "Epochs: 93, AvgLoss: 36.2975\n", "torch.Size([1976, 250])\n", "Epochs: 94, AvgLoss: 36.3010\n", "torch.Size([1976, 250])\n", "Epochs: 95, AvgLoss: 36.2380\n", "torch.Size([1976, 250])\n", "Epochs: 96, AvgLoss: 36.1668\n", "torch.Size([1976, 250])\n", "Epochs: 97, AvgLoss: 36.1449\n", "torch.Size([1976, 250])\n", "Epochs: 98, AvgLoss: 36.1306\n", "torch.Size([1976, 250])\n", "Epochs: 99, AvgLoss: 36.0621\n", "torch.Size([1976, 250])\n", "Epochs: 100, AvgLoss: 36.0481\n", "torch.Size([1976, 250])\n", "Epochs: 101, AvgLoss: 35.9848\n", "torch.Size([1976, 250])\n", "Epochs: 102, AvgLoss: 35.9509\n", "torch.Size([1976, 250])\n", "Epochs: 103, AvgLoss: 35.9186\n", "torch.Size([1976, 250])\n", "Epochs: 104, AvgLoss: 35.8999\n", "torch.Size([1976, 250])\n", "Epochs: 105, AvgLoss: 35.8258\n", "torch.Size([1976, 250])\n", "Epochs: 106, AvgLoss: 35.8325\n", "torch.Size([1976, 250])\n", "Epochs: 107, AvgLoss: 35.7987\n", "torch.Size([1976, 250])\n", "Epochs: 108, AvgLoss: 35.7575\n", "torch.Size([1976, 250])\n", "Epochs: 109, AvgLoss: 35.7261\n", "torch.Size([1976, 250])\n", "Epochs: 110, AvgLoss: 35.6974\n", "torch.Size([1976, 250])\n", "Epochs: 111, AvgLoss: 35.6881\n", "torch.Size([1976, 250])\n", "Epochs: 112, AvgLoss: 35.6504\n", "torch.Size([1976, 250])\n", "Epochs: 113, AvgLoss: 35.6312\n", "torch.Size([1976, 250])\n", "Epochs: 114, AvgLoss: 35.6040\n", "torch.Size([1976, 250])\n", "Epochs: 115, AvgLoss: 35.5738\n", "torch.Size([1976, 250])\n", "Epochs: 116, AvgLoss: 35.5416\n", "torch.Size([1976, 250])\n", "Epochs: 117, AvgLoss: 35.5355\n", "torch.Size([1976, 250])\n", "Epochs: 118, AvgLoss: 35.4946\n", "torch.Size([1976, 250])\n", "Epochs: 119, AvgLoss: 35.4830\n", "torch.Size([1976, 250])\n", "Epochs: 120, AvgLoss: 35.4660\n", "torch.Size([1976, 250])\n", "Epochs: 121, AvgLoss: 35.4510\n", "torch.Size([1976, 250])\n", "Epochs: 122, AvgLoss: 35.4364\n", "torch.Size([1976, 250])\n", "Epochs: 123, AvgLoss: 35.3916\n", "torch.Size([1976, 250])\n", "Epochs: 124, AvgLoss: 35.4018\n", "torch.Size([1976, 250])\n", "Epochs: 125, AvgLoss: 35.3690\n", "torch.Size([1976, 250])\n", "Epochs: 126, AvgLoss: 35.3416\n", "torch.Size([1976, 250])\n", "Epochs: 127, AvgLoss: 35.3350\n", "torch.Size([1976, 250])\n", "Epochs: 128, AvgLoss: 35.3176\n", "torch.Size([1976, 250])\n", "Epochs: 129, AvgLoss: 35.2928\n", "torch.Size([1976, 250])\n", "Epochs: 130, AvgLoss: 35.2707\n", "torch.Size([1976, 250])\n", "Epochs: 131, AvgLoss: 35.2512\n", "torch.Size([1976, 250])\n", "Epochs: 132, AvgLoss: 35.2447\n", "torch.Size([1976, 250])\n", "Epochs: 133, AvgLoss: 35.1962\n", "torch.Size([1976, 250])\n", "Epochs: 134, AvgLoss: 35.2171\n", "torch.Size([1976, 250])\n", "Epochs: 135, AvgLoss: 35.1735\n", "torch.Size([1976, 250])\n", "Epochs: 136, AvgLoss: 35.1476\n", "torch.Size([1976, 250])\n", "Epochs: 137, AvgLoss: 35.1333\n", "torch.Size([1976, 250])\n", "Epochs: 138, AvgLoss: 35.1139\n", "torch.Size([1976, 250])\n", "Epochs: 139, AvgLoss: 35.0876\n", "torch.Size([1976, 250])\n", "Epochs: 140, AvgLoss: 35.0622\n", "torch.Size([1976, 250])\n", "Epochs: 141, AvgLoss: 35.0387\n", "torch.Size([1976, 250])\n", "Epochs: 142, AvgLoss: 35.0276\n", "torch.Size([1976, 250])\n", "Epochs: 143, AvgLoss: 35.0020\n", "torch.Size([1976, 250])\n", "Epochs: 144, AvgLoss: 34.9714\n", "torch.Size([1976, 250])\n", "Epochs: 145, AvgLoss: 34.9774\n", "torch.Size([1976, 250])\n", "Epochs: 146, AvgLoss: 34.9330\n", "torch.Size([1976, 250])\n", "Epochs: 147, AvgLoss: 34.9082\n", "torch.Size([1976, 250])\n", "Epochs: 148, AvgLoss: 34.8806\n", "torch.Size([1976, 250])\n", "Epochs: 149, AvgLoss: 34.8587\n", "torch.Size([1976, 250])\n", "Epochs: 150, AvgLoss: 34.8644\n", "torch.Size([1976, 250])\n", "Epochs: 151, AvgLoss: 34.8321\n", "torch.Size([1976, 250])\n", "Epochs: 152, AvgLoss: 34.7980\n", "torch.Size([1976, 250])\n", "Epochs: 153, AvgLoss: 34.7721\n", "torch.Size([1976, 250])\n", "Epochs: 154, AvgLoss: 34.7337\n", "torch.Size([1976, 250])\n", "Epochs: 155, AvgLoss: 34.7185\n", "torch.Size([1976, 250])\n", "Epochs: 156, AvgLoss: 34.6905\n", "torch.Size([1976, 250])\n", "Epochs: 157, AvgLoss: 34.6630\n", "torch.Size([1976, 250])\n", "Epochs: 158, AvgLoss: 34.6182\n", "torch.Size([1976, 250])\n", "Epochs: 159, AvgLoss: 34.6304\n", "torch.Size([1976, 250])\n", "Epochs: 160, AvgLoss: 34.5781\n", "torch.Size([1976, 250])\n", "Epochs: 161, AvgLoss: 34.5460\n", "torch.Size([1976, 250])\n", "Epochs: 162, AvgLoss: 34.5145\n", "torch.Size([1976, 250])\n", "Epochs: 163, AvgLoss: 34.4964\n", "torch.Size([1976, 250])\n", "Epochs: 164, AvgLoss: 34.4530\n", "torch.Size([1976, 250])\n", "Epochs: 165, AvgLoss: 34.4372\n", "torch.Size([1976, 250])\n", "Epochs: 166, AvgLoss: 34.4145\n", "torch.Size([1976, 250])\n", "Epochs: 167, AvgLoss: 34.3660\n", "torch.Size([1976, 250])\n", "Epochs: 168, AvgLoss: 34.3187\n", "torch.Size([1976, 250])\n", "Epochs: 169, AvgLoss: 34.2902\n", "torch.Size([1976, 250])\n", "Epochs: 170, AvgLoss: 34.2556\n", "torch.Size([1976, 250])\n", "Epochs: 171, AvgLoss: 34.2129\n", "torch.Size([1976, 250])\n", "Epochs: 172, AvgLoss: 34.1892\n", "torch.Size([1976, 250])\n", "Epochs: 173, AvgLoss: 34.1626\n", "torch.Size([1976, 250])\n", "Epochs: 174, AvgLoss: 34.1170\n", "torch.Size([1976, 250])\n", "Epochs: 175, AvgLoss: 34.0858\n", "torch.Size([1976, 250])\n", "Epochs: 176, AvgLoss: 34.0459\n", "torch.Size([1976, 250])\n", "Epochs: 177, AvgLoss: 34.0081\n", "torch.Size([1976, 250])\n", "Epochs: 178, AvgLoss: 33.9701\n", "torch.Size([1976, 250])\n", "Epochs: 179, AvgLoss: 33.9421\n", "torch.Size([1976, 250])\n", "Epochs: 180, AvgLoss: 33.8961\n", "torch.Size([1976, 250])\n", "Epochs: 181, AvgLoss: 33.8574\n", "torch.Size([1976, 250])\n", "Epochs: 182, AvgLoss: 33.8200\n", "torch.Size([1976, 250])\n", "Epochs: 183, AvgLoss: 33.7908\n", "torch.Size([1976, 250])\n", "Epochs: 184, AvgLoss: 33.7597\n", "torch.Size([1976, 250])\n", "Epochs: 185, AvgLoss: 33.7143\n", "torch.Size([1976, 250])\n", "Epochs: 186, AvgLoss: 33.6723\n", "torch.Size([1976, 250])\n", "Epochs: 187, AvgLoss: 33.6472\n", "torch.Size([1976, 250])\n", "Epochs: 188, AvgLoss: 33.6035\n", "torch.Size([1976, 250])\n", "Epochs: 189, AvgLoss: 33.5697\n", "torch.Size([1976, 250])\n", "Epochs: 190, AvgLoss: 33.5422\n", "torch.Size([1976, 250])\n", "Epochs: 191, AvgLoss: 33.5017\n", "torch.Size([1976, 250])\n", "Epochs: 192, AvgLoss: 33.4689\n", "torch.Size([1976, 250])\n", "Epochs: 193, AvgLoss: 33.4313\n", "torch.Size([1976, 250])\n", "Epochs: 194, AvgLoss: 33.4082\n", "torch.Size([1976, 250])\n", "Epochs: 195, AvgLoss: 33.3752\n", "torch.Size([1976, 250])\n", "Epochs: 196, AvgLoss: 33.3440\n", "torch.Size([1976, 250])\n", "Epochs: 197, AvgLoss: 33.3134\n", "torch.Size([1976, 250])\n", "Epochs: 198, AvgLoss: 33.2853\n", "torch.Size([1976, 250])\n", "Epochs: 199, AvgLoss: 33.2510\n", "torch.Size([1976, 250])\n", "Epochs: 200, AvgLoss: 33.2211\n", "torch.Size([1976, 250])\n", "Epochs: 201, AvgLoss: 33.1962\n", "torch.Size([1976, 250])\n", "Epochs: 202, AvgLoss: 33.1684\n", "torch.Size([1976, 250])\n", "Epochs: 203, AvgLoss: 33.1416\n", "torch.Size([1976, 250])\n", "Epochs: 204, AvgLoss: 33.1194\n", "torch.Size([1976, 250])\n", "Epochs: 205, AvgLoss: 33.0905\n", "torch.Size([1976, 250])\n", "Epochs: 206, AvgLoss: 33.0669\n", "torch.Size([1976, 250])\n", "Epochs: 207, AvgLoss: 33.0398\n", "torch.Size([1976, 250])\n", "Epochs: 208, AvgLoss: 33.0132\n", "torch.Size([1976, 250])\n", "Epochs: 209, AvgLoss: 32.9914\n", "torch.Size([1976, 250])\n", "Epochs: 210, AvgLoss: 32.9657\n", "torch.Size([1976, 250])\n", "Epochs: 211, AvgLoss: 32.9419\n", "torch.Size([1976, 250])\n", "Epochs: 212, AvgLoss: 32.9160\n", "torch.Size([1976, 250])\n", "Epochs: 213, AvgLoss: 32.8924\n", "torch.Size([1976, 250])\n", "Epochs: 214, AvgLoss: 32.8662\n", "torch.Size([1976, 250])\n", "Epochs: 215, AvgLoss: 32.8452\n", "torch.Size([1976, 250])\n", "Epochs: 216, AvgLoss: 32.8206\n", "torch.Size([1976, 250])\n", "Epochs: 217, AvgLoss: 32.7951\n", "torch.Size([1976, 250])\n", "Epochs: 218, AvgLoss: 32.7709\n", "torch.Size([1976, 250])\n", "Epochs: 219, AvgLoss: 32.7504\n", "torch.Size([1976, 250])\n", "Epochs: 220, AvgLoss: 32.7258\n", "torch.Size([1976, 250])\n", "Epochs: 221, AvgLoss: 32.7013\n", "torch.Size([1976, 250])\n", "Epochs: 222, AvgLoss: 32.6786\n", "torch.Size([1976, 250])\n", "Epochs: 223, AvgLoss: 32.6537\n", "torch.Size([1976, 250])\n", "Epochs: 224, AvgLoss: 32.6333\n", "torch.Size([1976, 250])\n", "Epochs: 225, AvgLoss: 32.6071\n", "torch.Size([1976, 250])\n", "Epochs: 226, AvgLoss: 32.5862\n", "torch.Size([1976, 250])\n", "Epochs: 227, AvgLoss: 32.5629\n", "torch.Size([1976, 250])\n", "Epochs: 228, AvgLoss: 32.5413\n", "torch.Size([1976, 250])\n", "Epochs: 229, AvgLoss: 32.5220\n", "torch.Size([1976, 250])\n", "Epochs: 230, AvgLoss: 32.4977\n", "torch.Size([1976, 250])\n", "Epochs: 231, AvgLoss: 32.4777\n", "torch.Size([1976, 250])\n", "Epochs: 232, AvgLoss: 32.4565\n", "torch.Size([1976, 250])\n", "Epochs: 233, AvgLoss: 32.4344\n", "torch.Size([1976, 250])\n", "Epochs: 234, AvgLoss: 32.4116\n", "torch.Size([1976, 250])\n", "Epochs: 235, AvgLoss: 32.3906\n", "torch.Size([1976, 250])\n", "Epochs: 236, AvgLoss: 32.3728\n", "torch.Size([1976, 250])\n", "Epochs: 237, AvgLoss: 32.3500\n", "torch.Size([1976, 250])\n", "Epochs: 238, AvgLoss: 32.3282\n", "torch.Size([1976, 250])\n", "Epochs: 239, AvgLoss: 32.3063\n", "torch.Size([1976, 250])\n", "Epochs: 240, AvgLoss: 32.2858\n", "torch.Size([1976, 250])\n", "Epochs: 241, AvgLoss: 32.2655\n", "torch.Size([1976, 250])\n", "Epochs: 242, AvgLoss: 32.2450\n", "torch.Size([1976, 250])\n", "Epochs: 243, AvgLoss: 32.2259\n", "torch.Size([1976, 250])\n", "Epochs: 244, AvgLoss: 32.2041\n", "torch.Size([1976, 250])\n", "Epochs: 245, AvgLoss: 32.1839\n", "torch.Size([1976, 250])\n", "Epochs: 246, AvgLoss: 32.1665\n", "torch.Size([1976, 250])\n", "Epochs: 247, AvgLoss: 32.1488\n", "torch.Size([1976, 250])\n", "Epochs: 248, AvgLoss: 32.1303\n", "torch.Size([1976, 250])\n", "Epochs: 249, AvgLoss: 32.1142\n", "torch.Size([1976, 250])\n", "Epochs: 250, AvgLoss: 32.0981\n", "torch.Size([1976, 250])\n", "Epochs: 251, AvgLoss: 32.0830\n", "torch.Size([1976, 250])\n", "Epochs: 252, AvgLoss: 32.0686\n", "torch.Size([1976, 250])\n", "Epochs: 253, AvgLoss: 32.0537\n", "torch.Size([1976, 250])\n", "Epochs: 254, AvgLoss: 32.0384\n", "torch.Size([1976, 250])\n", "Epochs: 255, AvgLoss: 32.0233\n", "torch.Size([1976, 250])\n", "Epochs: 256, AvgLoss: 32.0072\n", "torch.Size([1976, 250])\n", "Epochs: 257, AvgLoss: 31.9917\n", "torch.Size([1976, 250])\n", "Epochs: 258, AvgLoss: 31.9754\n", "torch.Size([1976, 250])\n", "Epochs: 259, AvgLoss: 31.9594\n", "torch.Size([1976, 250])\n", "Epochs: 260, AvgLoss: 31.9419\n", "torch.Size([1976, 250])\n", "Epochs: 261, AvgLoss: 31.9252\n", "torch.Size([1976, 250])\n", "Epochs: 262, AvgLoss: 31.9056\n", "torch.Size([1976, 250])\n", "Epochs: 263, AvgLoss: 31.8864\n", "torch.Size([1976, 250])\n", "Epochs: 264, AvgLoss: 31.8648\n", "torch.Size([1976, 250])\n", "Epochs: 265, AvgLoss: 31.8408\n", "torch.Size([1976, 250])\n", "Epochs: 266, AvgLoss: 31.8145\n", "torch.Size([1976, 250])\n", "Epochs: 267, AvgLoss: 31.7850\n", "torch.Size([1976, 250])\n", "Epochs: 268, AvgLoss: 31.7519\n", "torch.Size([1976, 250])\n", "Epochs: 269, AvgLoss: 31.7135\n", "torch.Size([1976, 250])\n", "Epochs: 270, AvgLoss: 31.6700\n", "torch.Size([1976, 250])\n", "Epochs: 271, AvgLoss: 31.6182\n", "torch.Size([1976, 250])\n", "Epochs: 272, AvgLoss: 31.5607\n", "torch.Size([1976, 250])\n", "Epochs: 273, AvgLoss: 31.4952\n", "torch.Size([1976, 250])\n", "Epochs: 274, AvgLoss: 31.4236\n", "torch.Size([1976, 250])\n", "Epochs: 275, AvgLoss: 31.3482\n", "torch.Size([1976, 250])\n", "Epochs: 276, AvgLoss: 31.2754\n", "torch.Size([1976, 250])\n", "Epochs: 277, AvgLoss: 31.2053\n", "torch.Size([1976, 250])\n", "Epochs: 278, AvgLoss: 31.1433\n", "torch.Size([1976, 250])\n", "Epochs: 279, AvgLoss: 31.0896\n", "torch.Size([1976, 250])\n", "Epochs: 280, AvgLoss: 31.0411\n", "torch.Size([1976, 250])\n", "Epochs: 281, AvgLoss: 31.0003\n", "torch.Size([1976, 250])\n", "Epochs: 282, AvgLoss: 30.9580\n", "torch.Size([1976, 250])\n", "Epochs: 283, AvgLoss: 30.9157\n", "torch.Size([1976, 250])\n", "Epochs: 284, AvgLoss: 30.8708\n", "torch.Size([1976, 250])\n", "Epochs: 285, AvgLoss: 30.8267\n", "torch.Size([1976, 250])\n", "Epochs: 286, AvgLoss: 30.7836\n", "torch.Size([1976, 250])\n", "Epochs: 287, AvgLoss: 30.7413\n", "torch.Size([1976, 250])\n", "Epochs: 288, AvgLoss: 30.7035\n", "torch.Size([1976, 250])\n", "Epochs: 289, AvgLoss: 30.6656\n", "torch.Size([1976, 250])\n", "Epochs: 290, AvgLoss: 30.6328\n", "torch.Size([1976, 250])\n", "Epochs: 291, AvgLoss: 30.5973\n", "torch.Size([1976, 250])\n", "Epochs: 292, AvgLoss: 30.5661\n", "torch.Size([1976, 250])\n", "Epochs: 293, AvgLoss: 30.5372\n", "torch.Size([1976, 250])\n", "Epochs: 294, AvgLoss: 30.5093\n", "torch.Size([1976, 250])\n", "Epochs: 295, AvgLoss: 30.4850\n", "torch.Size([1976, 250])\n", "Epochs: 296, AvgLoss: 30.4662\n", "torch.Size([1976, 250])\n", "Epochs: 297, AvgLoss: 30.4512\n", "torch.Size([1976, 250])\n", "Epochs: 298, AvgLoss: 30.4414\n", "torch.Size([1976, 250])\n", "Epochs: 299, AvgLoss: 30.4330\n", "torch.Size([1976, 250])\n", "Epochs: 300, AvgLoss: 30.4254\n", "torch.Size([1976, 250])\n", "Epochs: 301, AvgLoss: 30.4175\n", "torch.Size([1976, 250])\n", "Epochs: 302, AvgLoss: 30.4105\n", "torch.Size([1976, 250])\n", "Epochs: 303, AvgLoss: 30.4049\n", "torch.Size([1976, 250])\n", "Epochs: 304, AvgLoss: 30.3983\n", "torch.Size([1976, 250])\n", "Epochs: 305, AvgLoss: 30.3910\n", "torch.Size([1976, 250])\n", "Epochs: 306, AvgLoss: 30.3854\n", "torch.Size([1976, 250])\n", "Epochs: 307, AvgLoss: 30.3806\n", "torch.Size([1976, 250])\n", "Epochs: 308, AvgLoss: 30.3758\n", "torch.Size([1976, 250])\n", "Epochs: 309, AvgLoss: 30.3701\n", "torch.Size([1976, 250])\n", "Epochs: 310, AvgLoss: 30.3660\n", "torch.Size([1976, 250])\n", "Epochs: 311, AvgLoss: 30.3612\n", "torch.Size([1976, 250])\n", "Epochs: 312, AvgLoss: 30.3563\n", "torch.Size([1976, 250])\n", "Epochs: 313, AvgLoss: 30.3521\n", "torch.Size([1976, 250])\n", "Epochs: 314, AvgLoss: 30.3483\n", "torch.Size([1976, 250])\n", "Epochs: 315, AvgLoss: 30.3442\n", "torch.Size([1976, 250])\n", "Epochs: 316, AvgLoss: 30.3403\n", "torch.Size([1976, 250])\n", "Epochs: 317, AvgLoss: 30.3368\n", "torch.Size([1976, 250])\n", "Epochs: 318, AvgLoss: 30.3330\n", "torch.Size([1976, 250])\n", "Epochs: 319, AvgLoss: 30.3304\n", "torch.Size([1976, 250])\n", "Epochs: 320, AvgLoss: 30.3269\n", "torch.Size([1976, 250])\n", "Epochs: 321, AvgLoss: 30.3238\n", "torch.Size([1976, 250])\n", "Epochs: 322, AvgLoss: 30.3211\n", "torch.Size([1976, 250])\n", "Epochs: 323, AvgLoss: 30.3180\n", "torch.Size([1976, 250])\n", "Epochs: 324, AvgLoss: 30.3153\n", "torch.Size([1976, 250])\n", "Epochs: 325, AvgLoss: 30.3119\n", "torch.Size([1976, 250])\n", "Epochs: 326, AvgLoss: 30.3089\n", "torch.Size([1976, 250])\n", "Epochs: 327, AvgLoss: 30.3067\n", "torch.Size([1976, 250])\n", "Epochs: 328, AvgLoss: 30.3038\n", "torch.Size([1976, 250])\n", "Epochs: 329, AvgLoss: 30.3015\n", "torch.Size([1976, 250])\n", "Epochs: 330, AvgLoss: 30.2993\n", "torch.Size([1976, 250])\n", "Epochs: 331, AvgLoss: 30.2966\n", "torch.Size([1976, 250])\n", "Epochs: 332, AvgLoss: 30.2940\n", "torch.Size([1976, 250])\n", "Epochs: 333, AvgLoss: 30.2918\n", "torch.Size([1976, 250])\n", "Epochs: 334, AvgLoss: 30.2897\n", "torch.Size([1976, 250])\n", "Epochs: 335, AvgLoss: 30.2876\n", "torch.Size([1976, 250])\n", "Epochs: 336, AvgLoss: 30.2852\n", "torch.Size([1976, 250])\n", "Epochs: 337, AvgLoss: 30.2830\n", "torch.Size([1976, 250])\n", "Epochs: 338, AvgLoss: 30.2806\n", "torch.Size([1976, 250])\n", "Epochs: 339, AvgLoss: 30.2784\n", "torch.Size([1976, 250])\n", "Epochs: 340, AvgLoss: 30.2761\n", "torch.Size([1976, 250])\n", "Epochs: 341, AvgLoss: 30.2743\n", "torch.Size([1976, 250])\n", "Epochs: 342, AvgLoss: 30.2719\n", "torch.Size([1976, 250])\n", "Epochs: 343, AvgLoss: 30.2697\n", "torch.Size([1976, 250])\n", "Epochs: 344, AvgLoss: 30.2676\n", "torch.Size([1976, 250])\n", "Epochs: 345, AvgLoss: 30.2646\n", "torch.Size([1976, 250])\n", "Epochs: 346, AvgLoss: 30.2622\n", "torch.Size([1976, 250])\n", "Epochs: 347, AvgLoss: 30.2599\n", "torch.Size([1976, 250])\n", "Epochs: 348, AvgLoss: 30.2574\n", "torch.Size([1976, 250])\n", "Epochs: 349, AvgLoss: 30.2555\n", "torch.Size([1976, 250])\n", "Epochs: 350, AvgLoss: 30.2531\n", "torch.Size([1976, 250])\n", "Epochs: 351, AvgLoss: 30.2517\n", "torch.Size([1976, 250])\n", "Epochs: 352, AvgLoss: 30.2493\n", "torch.Size([1976, 250])\n", "Epochs: 353, AvgLoss: 30.2463\n", "torch.Size([1976, 250])\n", "Epochs: 354, AvgLoss: 30.2443\n", "torch.Size([1976, 250])\n", "Epochs: 355, AvgLoss: 30.2419\n", "torch.Size([1976, 250])\n", "Epochs: 356, AvgLoss: 30.2393\n", "torch.Size([1976, 250])\n", "Epochs: 357, AvgLoss: 30.2374\n", "torch.Size([1976, 250])\n", "Epochs: 358, AvgLoss: 30.2348\n", "torch.Size([1976, 250])\n", "Epochs: 359, AvgLoss: 30.2325\n", "torch.Size([1976, 250])\n", "Epochs: 360, AvgLoss: 30.2303\n", "torch.Size([1976, 250])\n", "Epochs: 361, AvgLoss: 30.2272\n", "torch.Size([1976, 250])\n", "Epochs: 362, AvgLoss: 30.2247\n", "torch.Size([1976, 250])\n", "Epochs: 363, AvgLoss: 30.2222\n", "torch.Size([1976, 250])\n", "Epochs: 364, AvgLoss: 30.2197\n", "torch.Size([1976, 250])\n", "Epochs: 365, AvgLoss: 30.2167\n", "torch.Size([1976, 250])\n", "Epochs: 366, AvgLoss: 30.2142\n", "torch.Size([1976, 250])\n", "Epochs: 367, AvgLoss: 30.2116\n", "torch.Size([1976, 250])\n", "Epochs: 368, AvgLoss: 30.2083\n", "torch.Size([1976, 250])\n", "Epochs: 369, AvgLoss: 30.2056\n", "torch.Size([1976, 250])\n", "Epochs: 370, AvgLoss: 30.2027\n", "torch.Size([1976, 250])\n", "Epochs: 371, AvgLoss: 30.1996\n", "torch.Size([1976, 250])\n", "Epochs: 372, AvgLoss: 30.1968\n", "torch.Size([1976, 250])\n", "Epochs: 373, AvgLoss: 30.1934\n", "torch.Size([1976, 250])\n", "Epochs: 374, AvgLoss: 30.1903\n", "torch.Size([1976, 250])\n", "Epochs: 375, AvgLoss: 30.1872\n", "torch.Size([1976, 250])\n", "Epochs: 376, AvgLoss: 30.1837\n", "torch.Size([1976, 250])\n", "Epochs: 377, AvgLoss: 30.1801\n", "torch.Size([1976, 250])\n", "Epochs: 378, AvgLoss: 30.1768\n", "torch.Size([1976, 250])\n", "Epochs: 379, AvgLoss: 30.1735\n", "torch.Size([1976, 250])\n", "Epochs: 380, AvgLoss: 30.1702\n", "torch.Size([1976, 250])\n", "Epochs: 381, AvgLoss: 30.1667\n", "torch.Size([1976, 250])\n", "Epochs: 382, AvgLoss: 30.1632\n", "torch.Size([1976, 250])\n", "Epochs: 383, AvgLoss: 30.1600\n", "torch.Size([1976, 250])\n", "Epochs: 384, AvgLoss: 30.1566\n", "torch.Size([1976, 250])\n", "Epochs: 385, AvgLoss: 30.1531\n", "torch.Size([1976, 250])\n", "Epochs: 386, AvgLoss: 30.1502\n", "torch.Size([1976, 250])\n", "Epochs: 387, AvgLoss: 30.1468\n", "torch.Size([1976, 250])\n", "Epochs: 388, AvgLoss: 30.1433\n", "torch.Size([1976, 250])\n", "Epochs: 389, AvgLoss: 30.1400\n", "torch.Size([1976, 250])\n", "Epochs: 390, AvgLoss: 30.1362\n", "torch.Size([1976, 250])\n", "Epochs: 391, AvgLoss: 30.1338\n", "torch.Size([1976, 250])\n", "Epochs: 392, AvgLoss: 30.1298\n", "torch.Size([1976, 250])\n", "Epochs: 393, AvgLoss: 30.1269\n", "torch.Size([1976, 250])\n", "Epochs: 394, AvgLoss: 30.1239\n", "torch.Size([1976, 250])\n", "Epochs: 395, AvgLoss: 30.1204\n", "torch.Size([1976, 250])\n", "Epochs: 396, AvgLoss: 30.1176\n", "torch.Size([1976, 250])\n", "Epochs: 397, AvgLoss: 30.1142\n", "torch.Size([1976, 250])\n", "Epochs: 398, AvgLoss: 30.1120\n", "torch.Size([1976, 250])\n", "Epochs: 399, AvgLoss: 30.1090\n", "torch.Size([1976, 250])\n", "Epochs: 400, AvgLoss: 30.1064\n", "torch.Size([1976, 250])\n", "Epochs: 401, AvgLoss: 30.1039\n", "torch.Size([1976, 250])\n", "Epochs: 402, AvgLoss: 30.1020\n", "torch.Size([1976, 250])\n", "Epochs: 403, AvgLoss: 30.0982\n", "torch.Size([1976, 250])\n", "Epochs: 404, AvgLoss: 30.0940\n", "torch.Size([1976, 250])\n", "Epochs: 405, AvgLoss: 30.0905\n", "torch.Size([1976, 250])\n", "Epochs: 406, AvgLoss: 30.0879\n", "torch.Size([1976, 250])\n", "Epochs: 407, AvgLoss: 30.0859\n", "torch.Size([1976, 250])\n", "Epochs: 408, AvgLoss: 30.0826\n", "torch.Size([1976, 250])\n", "Epochs: 409, AvgLoss: 30.0781\n", "torch.Size([1976, 250])\n", "Epochs: 410, AvgLoss: 30.0754\n", "torch.Size([1976, 250])\n", "Epochs: 411, AvgLoss: 30.0735\n", "torch.Size([1976, 250])\n", "Epochs: 412, AvgLoss: 30.0704\n", "torch.Size([1976, 250])\n", "Epochs: 413, AvgLoss: 30.0666\n", "torch.Size([1976, 250])\n", "Epochs: 414, AvgLoss: 30.0626\n", "torch.Size([1976, 250])\n", "Epochs: 415, AvgLoss: 30.0602\n", "torch.Size([1976, 250])\n", "Epochs: 416, AvgLoss: 30.0580\n", "torch.Size([1976, 250])\n", "Epochs: 417, AvgLoss: 30.0543\n", "torch.Size([1976, 250])\n", "Epochs: 418, AvgLoss: 30.0514\n", "torch.Size([1976, 250])\n", "Epochs: 419, AvgLoss: 30.0473\n", "torch.Size([1976, 250])\n", "Epochs: 420, AvgLoss: 30.0446\n", "torch.Size([1976, 250])\n", "Epochs: 421, AvgLoss: 30.0420\n", "torch.Size([1976, 250])\n", "Epochs: 422, AvgLoss: 30.0383\n", "torch.Size([1976, 250])\n", "Epochs: 423, AvgLoss: 30.0349\n", "torch.Size([1976, 250])\n", "Epochs: 424, AvgLoss: 30.0318\n", "torch.Size([1976, 250])\n", "Epochs: 425, AvgLoss: 30.0283\n", "torch.Size([1976, 250])\n", "Epochs: 426, AvgLoss: 30.0253\n", "torch.Size([1976, 250])\n", "Epochs: 427, AvgLoss: 30.0218\n", "torch.Size([1976, 250])\n", "Epochs: 428, AvgLoss: 30.0184\n", "torch.Size([1976, 250])\n", "Epochs: 429, AvgLoss: 30.0147\n", "torch.Size([1976, 250])\n", "Epochs: 430, AvgLoss: 30.0113\n", "torch.Size([1976, 250])\n", "Epochs: 431, AvgLoss: 30.0075\n", "torch.Size([1976, 250])\n", "Epochs: 432, AvgLoss: 30.0031\n", "torch.Size([1976, 250])\n", "Epochs: 433, AvgLoss: 29.9999\n", "torch.Size([1976, 250])\n", "Epochs: 434, AvgLoss: 29.9963\n", "torch.Size([1976, 250])\n", "Epochs: 435, AvgLoss: 29.9928\n", "torch.Size([1976, 250])\n", "Epochs: 436, AvgLoss: 29.9888\n", "torch.Size([1976, 250])\n", "Epochs: 437, AvgLoss: 29.9851\n", "torch.Size([1976, 250])\n", "Epochs: 438, AvgLoss: 29.9806\n", "torch.Size([1976, 250])\n", "Epochs: 439, AvgLoss: 29.9769\n", "torch.Size([1976, 250])\n", "Epochs: 440, AvgLoss: 29.9733\n", "torch.Size([1976, 250])\n", "Epochs: 441, AvgLoss: 29.9700\n", "torch.Size([1976, 250])\n", "Epochs: 442, AvgLoss: 29.9658\n", "torch.Size([1976, 250])\n", "Epochs: 443, AvgLoss: 29.9624\n", "torch.Size([1976, 250])\n", "Epochs: 444, AvgLoss: 29.9585\n", "torch.Size([1976, 250])\n", "Epochs: 445, AvgLoss: 29.9545\n", "torch.Size([1976, 250])\n", "Epochs: 446, AvgLoss: 29.9499\n", "torch.Size([1976, 250])\n", "Epochs: 447, AvgLoss: 29.9462\n", "torch.Size([1976, 250])\n", "Epochs: 448, AvgLoss: 29.9419\n", "torch.Size([1976, 250])\n", "Epochs: 449, AvgLoss: 29.9385\n", "torch.Size([1976, 250])\n", "Epochs: 450, AvgLoss: 29.9346\n", "torch.Size([1976, 250])\n", "Epochs: 451, AvgLoss: 29.9312\n", "torch.Size([1976, 250])\n", "Epochs: 452, AvgLoss: 29.9266\n", "torch.Size([1976, 250])\n", "Epochs: 453, AvgLoss: 29.9230\n", "torch.Size([1976, 250])\n", "Epochs: 454, AvgLoss: 29.9190\n", "torch.Size([1976, 250])\n", "Epochs: 455, AvgLoss: 29.9155\n", "torch.Size([1976, 250])\n", "Epochs: 456, AvgLoss: 29.9113\n", "torch.Size([1976, 250])\n", "Epochs: 457, AvgLoss: 29.9079\n", "torch.Size([1976, 250])\n", "Epochs: 458, AvgLoss: 29.9040\n", "torch.Size([1976, 250])\n", "Epochs: 459, AvgLoss: 29.9006\n", "torch.Size([1976, 250])\n", "Epochs: 460, AvgLoss: 29.8968\n", "torch.Size([1976, 250])\n", "Epochs: 461, AvgLoss: 29.8927\n", "torch.Size([1976, 250])\n", "Epochs: 462, AvgLoss: 29.8896\n", "torch.Size([1976, 250])\n", "Epochs: 463, AvgLoss: 29.8865\n", "torch.Size([1976, 250])\n", "Epochs: 464, AvgLoss: 29.8837\n", "torch.Size([1976, 250])\n", "Epochs: 465, AvgLoss: 29.8803\n", "torch.Size([1976, 250])\n", "Epochs: 466, AvgLoss: 29.8770\n", "torch.Size([1976, 250])\n", "Epochs: 467, AvgLoss: 29.8738\n", "torch.Size([1976, 250])\n", "Epochs: 468, AvgLoss: 29.8700\n", "torch.Size([1976, 250])\n", "Epochs: 469, AvgLoss: 29.8662\n", "torch.Size([1976, 250])\n", "Epochs: 470, AvgLoss: 29.8624\n", "torch.Size([1976, 250])\n", "Epochs: 471, AvgLoss: 29.8603\n", "torch.Size([1976, 250])\n", "Epochs: 472, AvgLoss: 29.8575\n", "torch.Size([1976, 250])\n", "Epochs: 473, AvgLoss: 29.8546\n", "torch.Size([1976, 250])\n", "Epochs: 474, AvgLoss: 29.8514\n", "torch.Size([1976, 250])\n", "Epochs: 475, AvgLoss: 29.8484\n", "torch.Size([1976, 250])\n", "Epochs: 476, AvgLoss: 29.8451\n", "torch.Size([1976, 250])\n", "Epochs: 477, AvgLoss: 29.8420\n", "torch.Size([1976, 250])\n", "Epochs: 478, AvgLoss: 29.8397\n", "torch.Size([1976, 250])\n", "Epochs: 479, AvgLoss: 29.8370\n", "torch.Size([1976, 250])\n", "Epochs: 480, AvgLoss: 29.8347\n", "torch.Size([1976, 250])\n", "Epochs: 481, AvgLoss: 29.8317\n", "torch.Size([1976, 250])\n", "Epochs: 482, AvgLoss: 29.8291\n", "torch.Size([1976, 250])\n", "Epochs: 483, AvgLoss: 29.8263\n", "torch.Size([1976, 250])\n", "Epochs: 484, AvgLoss: 29.8238\n", "torch.Size([1976, 250])\n", "Epochs: 485, AvgLoss: 29.8209\n", "torch.Size([1976, 250])\n", "Epochs: 486, AvgLoss: 29.8188\n", "torch.Size([1976, 250])\n", "Epochs: 487, AvgLoss: 29.8158\n", "torch.Size([1976, 250])\n", "Epochs: 488, AvgLoss: 29.8135\n", "torch.Size([1976, 250])\n", "Epochs: 489, AvgLoss: 29.8118\n", "torch.Size([1976, 250])\n", "Epochs: 490, AvgLoss: 29.8094\n", "torch.Size([1976, 250])\n", "Epochs: 491, AvgLoss: 29.8075\n", "torch.Size([1976, 250])\n", "Epochs: 492, AvgLoss: 29.8052\n", "torch.Size([1976, 250])\n", "Epochs: 493, AvgLoss: 29.8032\n", "torch.Size([1976, 250])\n", "Epochs: 494, AvgLoss: 29.8007\n", "torch.Size([1976, 250])\n", "Epochs: 495, AvgLoss: 29.7990\n", "torch.Size([1976, 250])\n", "Epochs: 496, AvgLoss: 29.7966\n", "torch.Size([1976, 250])\n", "Epochs: 497, AvgLoss: 29.7945\n", "torch.Size([1976, 250])\n", "Epochs: 498, AvgLoss: 29.7926\n", "torch.Size([1976, 250])\n", "Epochs: 499, AvgLoss: 29.7903\n", "torch.Size([1976, 250])\n", "Epochs: 500, AvgLoss: 29.7883\n", "torch.Size([1976, 250])\n", "Epochs: 501, AvgLoss: 29.7866\n", "torch.Size([1976, 250])\n", "Epochs: 502, AvgLoss: 29.7842\n", "torch.Size([1976, 250])\n", "Epochs: 503, AvgLoss: 29.7824\n", "torch.Size([1976, 250])\n", "Epochs: 504, AvgLoss: 29.7807\n", "torch.Size([1976, 250])\n", "Epochs: 505, AvgLoss: 29.7791\n", "torch.Size([1976, 250])\n", "Epochs: 506, AvgLoss: 29.7766\n", "torch.Size([1976, 250])\n", "Epochs: 507, AvgLoss: 29.7749\n", "torch.Size([1976, 250])\n", "Epochs: 508, AvgLoss: 29.7730\n", "torch.Size([1976, 250])\n", "Epochs: 509, AvgLoss: 29.7713\n", "torch.Size([1976, 250])\n", "Epochs: 510, AvgLoss: 29.7697\n", "torch.Size([1976, 250])\n", "Epochs: 511, AvgLoss: 29.7683\n", "torch.Size([1976, 250])\n", "Epochs: 512, AvgLoss: 29.7664\n", "torch.Size([1976, 250])\n", "Epochs: 513, AvgLoss: 29.7649\n", "torch.Size([1976, 250])\n", "Epochs: 514, AvgLoss: 29.7635\n", "torch.Size([1976, 250])\n", "Epochs: 515, AvgLoss: 29.7620\n", "torch.Size([1976, 250])\n", "Epochs: 516, AvgLoss: 29.7605\n", "torch.Size([1976, 250])\n", "Epochs: 517, AvgLoss: 29.7584\n", "torch.Size([1976, 250])\n", "Epochs: 518, AvgLoss: 29.7569\n", "torch.Size([1976, 250])\n", "Epochs: 519, AvgLoss: 29.7556\n", "torch.Size([1976, 250])\n", "Epochs: 520, AvgLoss: 29.7536\n", "torch.Size([1976, 250])\n", "Epochs: 521, AvgLoss: 29.7518\n", "torch.Size([1976, 250])\n", "Epochs: 522, AvgLoss: 29.7499\n", "torch.Size([1976, 250])\n", "Epochs: 523, AvgLoss: 29.7483\n", "torch.Size([1976, 250])\n", "Epochs: 524, AvgLoss: 29.7468\n", "torch.Size([1976, 250])\n", "Epochs: 525, AvgLoss: 29.7454\n", "torch.Size([1976, 250])\n", "Epochs: 526, AvgLoss: 29.7435\n", "torch.Size([1976, 250])\n", "Epochs: 527, AvgLoss: 29.7421\n", "torch.Size([1976, 250])\n", "Epochs: 528, AvgLoss: 29.7410\n", "torch.Size([1976, 250])\n", "Epochs: 529, AvgLoss: 29.7392\n", "torch.Size([1976, 250])\n", "Epochs: 530, AvgLoss: 29.7380\n", "torch.Size([1976, 250])\n", "Epochs: 531, AvgLoss: 29.7366\n", "torch.Size([1976, 250])\n", "Epochs: 532, AvgLoss: 29.7347\n", "torch.Size([1976, 250])\n", "Epochs: 533, AvgLoss: 29.7338\n", "torch.Size([1976, 250])\n", "Epochs: 534, AvgLoss: 29.7316\n", "torch.Size([1976, 250])\n", "Epochs: 535, AvgLoss: 29.7306\n", "torch.Size([1976, 250])\n", "Epochs: 536, AvgLoss: 29.7289\n", "torch.Size([1976, 250])\n", "Epochs: 537, AvgLoss: 29.7272\n", "torch.Size([1976, 250])\n", "Epochs: 538, AvgLoss: 29.7260\n", "torch.Size([1976, 250])\n", "Epochs: 539, AvgLoss: 29.7244\n", "torch.Size([1976, 250])\n", "Epochs: 540, AvgLoss: 29.7231\n", "torch.Size([1976, 250])\n", "Epochs: 541, AvgLoss: 29.7217\n", "torch.Size([1976, 250])\n", "Epochs: 542, AvgLoss: 29.7204\n", "torch.Size([1976, 250])\n", "Epochs: 543, AvgLoss: 29.7191\n", "torch.Size([1976, 250])\n", "Epochs: 544, AvgLoss: 29.7174\n", "torch.Size([1976, 250])\n", "Epochs: 545, AvgLoss: 29.7158\n", "torch.Size([1976, 250])\n", "Epochs: 546, AvgLoss: 29.7145\n", "torch.Size([1976, 250])\n", "Epochs: 547, AvgLoss: 29.7130\n", "torch.Size([1976, 250])\n", "Epochs: 548, AvgLoss: 29.7119\n", "torch.Size([1976, 250])\n", "Epochs: 549, AvgLoss: 29.7103\n", "torch.Size([1976, 250])\n", "Epochs: 550, AvgLoss: 29.7094\n", "torch.Size([1976, 250])\n", "Epochs: 551, AvgLoss: 29.7083\n", "torch.Size([1976, 250])\n", "Epochs: 552, AvgLoss: 29.7071\n", "torch.Size([1976, 250])\n", "Epochs: 553, AvgLoss: 29.7060\n", "torch.Size([1976, 250])\n", "Epochs: 554, AvgLoss: 29.7047\n", "torch.Size([1976, 250])\n", "Epochs: 555, AvgLoss: 29.7038\n", "torch.Size([1976, 250])\n", "Epochs: 556, AvgLoss: 29.7027\n", "torch.Size([1976, 250])\n", "Epochs: 557, AvgLoss: 29.7007\n", "torch.Size([1976, 250])\n", "Epochs: 558, AvgLoss: 29.6982\n", "torch.Size([1976, 250])\n", "Epochs: 559, AvgLoss: 29.6970\n", "torch.Size([1976, 250])\n", "Epochs: 560, AvgLoss: 29.6957\n", "torch.Size([1976, 250])\n", "Epochs: 561, AvgLoss: 29.6946\n", "torch.Size([1976, 250])\n", "Epochs: 562, AvgLoss: 29.6934\n", "torch.Size([1976, 250])\n", "Epochs: 563, AvgLoss: 29.6928\n", "torch.Size([1976, 250])\n", "Epochs: 564, AvgLoss: 29.6911\n", "torch.Size([1976, 250])\n", "Epochs: 565, AvgLoss: 29.6894\n", "torch.Size([1976, 250])\n", "Epochs: 566, AvgLoss: 29.6880\n", "torch.Size([1976, 250])\n", "Epochs: 567, AvgLoss: 29.6863\n", "torch.Size([1976, 250])\n", "Epochs: 568, AvgLoss: 29.6850\n", "torch.Size([1976, 250])\n", "Epochs: 569, AvgLoss: 29.6841\n", "torch.Size([1976, 250])\n", "Epochs: 570, AvgLoss: 29.6830\n", "torch.Size([1976, 250])\n", "Epochs: 571, AvgLoss: 29.6819\n", "torch.Size([1976, 250])\n", "Epochs: 572, AvgLoss: 29.6802\n", "torch.Size([1976, 250])\n", "Epochs: 573, AvgLoss: 29.6785\n", "torch.Size([1976, 250])\n", "Epochs: 574, AvgLoss: 29.6772\n", "torch.Size([1976, 250])\n", "Epochs: 575, AvgLoss: 29.6757\n", "torch.Size([1976, 250])\n", "Epochs: 576, AvgLoss: 29.6749\n", "torch.Size([1976, 250])\n", "Epochs: 577, AvgLoss: 29.6736\n", "torch.Size([1976, 250])\n", "Epochs: 578, AvgLoss: 29.6723\n", "torch.Size([1976, 250])\n", "Epochs: 579, AvgLoss: 29.6709\n", "torch.Size([1976, 250])\n", "Epochs: 580, AvgLoss: 29.6697\n", "torch.Size([1976, 250])\n", "Epochs: 581, AvgLoss: 29.6684\n", "torch.Size([1976, 250])\n", "Epochs: 582, AvgLoss: 29.6671\n", "torch.Size([1976, 250])\n", "Epochs: 583, AvgLoss: 29.6657\n", "torch.Size([1976, 250])\n", "Epochs: 584, AvgLoss: 29.6643\n", "torch.Size([1976, 250])\n", "Epochs: 585, AvgLoss: 29.6625\n", "torch.Size([1976, 250])\n", "Epochs: 586, AvgLoss: 29.6616\n", "torch.Size([1976, 250])\n", "Epochs: 587, AvgLoss: 29.6600\n", "torch.Size([1976, 250])\n", "Epochs: 588, AvgLoss: 29.6586\n", "torch.Size([1976, 250])\n", "Epochs: 589, AvgLoss: 29.6574\n", "torch.Size([1976, 250])\n", "Epochs: 590, AvgLoss: 29.6562\n", "torch.Size([1976, 250])\n", "Epochs: 591, AvgLoss: 29.6552\n", "torch.Size([1976, 250])\n", "Epochs: 592, AvgLoss: 29.6535\n", "torch.Size([1976, 250])\n", "Epochs: 593, AvgLoss: 29.6519\n", "torch.Size([1976, 250])\n", "Epochs: 594, AvgLoss: 29.6508\n", "torch.Size([1976, 250])\n", "Epochs: 595, AvgLoss: 29.6492\n", "torch.Size([1976, 250])\n", "Epochs: 596, AvgLoss: 29.6484\n", "torch.Size([1976, 250])\n", "Epochs: 597, AvgLoss: 29.6469\n", "torch.Size([1976, 250])\n", "Epochs: 598, AvgLoss: 29.6456\n", "torch.Size([1976, 250])\n", "Epochs: 599, AvgLoss: 29.6446\n", "torch.Size([1976, 250])\n", "Epochs: 600, AvgLoss: 29.6428\n", "Training for VAE has been done.\n", "12.603759041056037\n", "torch.Size([1976, 250])\n", "(1976, 20)\n", "\n" ] } ], "source": [ "GeneRhythm_Model(input_data = 'PDAC.npy',graph='graph_index.npy',sc_data = adata)" ] }, { "cell_type": "markdown", "id": "ba19e832", "metadata": {}, "source": [ "# Part 3: Perturbation\n", "\n", "## 1. Gene perturbation \n", "Perform in silico perturbation of individual genes to evaluate their causal impact on global gene expression programs. For each perturbed gene, quantify downstream effects on other genes and identify significantly affected genes based on the strength and consistency of the response. Save to gene_perturbation.csv file.\n", "\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "2d5098ad-67bf-4a9b-9071-f29cae7efe92", "metadata": {}, "outputs": [], "source": [ "Gene_Perturbation('PDAC_Control.csv','PDAC_Disease.csv','./dataset/PDAC_Control','./dataset/PDAC_Disease',graph = graph)" ] }, { "cell_type": "markdown", "id": "18e6f1b2-5a96-4dd2-a95d-ccd3ca7fddcd", "metadata": {}, "source": [ "## 2. Drug-target perturbation \n", "Perturb gene sets corresponding to known drug targets to simulate pharmacological interventions. Analyze how drug-target perturbations propagate through the gene network and identify genes and regulatory programs that are most sensitive to drug-induced effects. Save to drug_perturbation.csv" ] }, { "cell_type": "code", "execution_count": 9, "id": "2da81295-ed19-4aec-b262-01b4a3f5ce4b", "metadata": {}, "outputs": [], "source": [ "Pathway_Drug_Perturbation('PDAC_Control.csv','PDAC_Disease.csv','./dataset/PDAC_Control','./dataset/PDAC_Disease', term_profile_path='./dataset/cmap_drug_target_genes.npy',out_csv='drug_perturbation.csv',graph = graph)" ] }, { "cell_type": "markdown", "id": "fce2433c-fd44-4842-8fbd-190a27fef082", "metadata": { "scrolled": true }, "source": [ "## 3. Pathway-level perturbation \n", "Perturb entire biological pathways by jointly modulating all member genes. Measure coordinated downstream responses to assess pathway-level regulatory influence and enable systematic comparison of pathway perturbation effects across conditions. Save to pathway_perturbation.csv.\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "a8406df7-cee7-41d2-bed7-431f6b1cf6e5", "metadata": {}, "outputs": [], "source": [ "Pathway_Drug_Perturbation('PDAC_Control.csv','PDAC_Disease.csv','./dataset/PDAC_Control','./dataset/PDAC_Disease', term_profile_path='./dataset/gesa_pathways.npy',out_csv='pathway_perturbation.csv',graph = graph)" ] }, { "cell_type": "markdown", "id": "b11396a5-d40d-4d4a-986f-8b08374c94bd", "metadata": {}, "source": [ "# Part 4: Survival Analysis\n", "To assess the clinical relevance of genes identified by the perturbation analysis, we performed survival analysis using bulk transcriptomic data with matched patient outcomes. Patients were stratified into high- and low-risk groups based on quartiles of a composite gene expression score, and survival differences were evaluated using Kaplan–Meier analysis and the log-rank test." ] }, { "cell_type": "code", "execution_count": 11, "id": "4488141f-eae9-4acd-a86a-bb13bd3828dd", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdoAAAGFCAYAAABaPDKNAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABhV0lEQVR4nO3dd3wU1f7/8ddsS++dltA7AtKLYEGUptKkCDbkqqg/u9jLVa8K3Ou1AlaQi1hQEbCD0qv0HjoBEtKzKVvn/P4I7JdIEchuNuXzfDzy0OzOznxm2N13zsyZczSllEIIIYQQPmHwdwFCCCFEdSZBK4QQQviQBK0QQgjhQxK0QgghhA9J0AohhBA+JEErhBBC+JAErRBCCOFDErRCCCGED0nQCiGEED4kQSuEEEL4kAStEEII4UMStEIIIYQPSdAKIYQQPiRBK4QQQviQBK0QQgjhQxK0QgghhA9J0ArhRUop3G43uq6f8ftfnzsbXddxu90opS5qe+da/u+erw4qah//7t/mYv/tRM0hQSsuSm5uLuvWrWPdunWsX7+evLw8lFIcOXLE8/i6devIzMwsEyhKKfbv38+2bdvKPK7rOgcOHGDevHm89957bNy4kZKSEn/smlfY7XZuu+023n33XQCcTid33XUX//73vykqKuL222/nyy+/POfr33zzTcaNG4fT6byg7aWmpjJ48GA2b9581ufT0tLo168ff/zxx0XvS1Wxfv16+vbty549e3y6nffff5/777//nP82n376KSNHjqS4uNindYiqx+TvAkTVsmLFCoYPH05cXBwlJSU0bNiQefPmMXXqVN555x2ioqJwu91YLBaefvppbrvtNgwGA0VFRQwdOpT09HT++OMPmjRpgq7rfPTRRzz33HMkJCSQkJDAK6+8wiOPPMLDDz/s831Ruo47Jwfldpd53BgVhcFiuaR16rrOunXriImJKd2GUvz555+YTCYCAgK49957SUpKQimFw+EgOzubqKgoCgoKiIyMJDU1lT///JOcnBx0XSc2NhbLabXouk5mZibBwcEUFRWRkJDAo48+SnJyMkopCgsLKSgoIDg4mMjISEpKSli+fDmZmZnY7Xays7PPWGdFcbvdFBcXl2nxaZpGSEgIBsOl/82fm5vLsmXLKCwsPOM5l8tFZmYmFouF6Ohoz/GLjo5G0zQyMzOJiorCYrF4Hj91bEpKSrBarZhMJoxGI9deey2dO3fGZDKh6zpZWVm4XC5iYmKwWCwcPHiQtWvX4nK5yM3NxeVyERsbi6Zpl7xvonqQoBUXRdd16tevz2+//UZaWho33HADq1evxu12079/f9555x0cDgcffvghDz/8MA0aNKB3795s3ryZw4cPExgYyNy5c5k4cSLHjx/n+eefZ/To0Tz99NOEhoaye/duMjIyKmZfios5fPsdOE/bnmYwUOedtwnu0KFc687MzGTDhg04nU5PC72oqIg777yT22+/nZEjR3L33Xdz/Phxateuzfbt2/noo48AyMjIYPz48ezYsYMhQ4bwz3/+0/PlX1hYSN++fYmJiSEzM5NXXnmFu+66iy+++IKAgAAeeOABjEYjNpuNf/7znzRp0qR0X3WdyZMns2zZMubMmeOXoM3IyGDWrFllzmgEBwdz5513EhIS4vXtHTlyhIkTJ3Lo0CFcLhfDhg3jzjvvZNiwYYwfP57LL7+ca665hilTptCwYUNuv/12Fi5cSEpKCgA///wzEydOJCQkhJ49e2IwGFizZg0///wzb775Jp9//jlBQUEkJyfz/vvve7ablZXFmDFjGDNmDP/4xz8kaIUErbh4BoOByMhIz2lj98kW4alWA8A999zDp59+yq+//soVV1zBRx99ROfOnenZsyfz58/noYceYteuXWiaxgMPPEBUVBQArVq1olWrVhWzI0rhtlrRCwr+7zFNQ7lc5V71999/z7Jly1BKef5wUEqRn5+PzWbjnXfeYffu3fz222/88ccf/PDDD7hObtdisTBlyhS++eYbJk2axIMPPkhSUpJnHXl5ecTFxfH111+Tm5tLbm4uTqeTr776irS0NGbNmoXL5aJevXqeen7++WeWLVvGjBkziIyMLPf+XQqlFDabrUzQlqclez66rvP222+zadMmFi9ezOrVq7njjjvo3r07nTp1Yt68eTidTnRdZ8mSJezdu5d69epRu3ZtzzocDgd79+7l7bffZsiQIbzwwgsUFBSQl5fHu+++S69evXjyySc5cuQIQUFBQOmlgscee4zExERGjRrls/0TVYu8C8RFO3z4MMOHD+emm26iTp06tG/f/oxlIiIiaNWqFbquc/ToUX7//XdGjx7NNddcw65du1i9ejVKKcLCwjynWauT0aNHs2HDBtasWeNpVZ7u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dpm/d++iHTt2jF9++YWcnByWLFmC0+mkX79+fPTRR3Tt2pXg4GDefPNNwsPDCQ8P54YbbuDhhx9m/vz57NixA5fLxZVXXkl2djaTJk3i448/JjY2lu3bt/Piiy/6e/cuiq7rPPbYY/zyyy889thjrF+/nr1793L99dfTpUsXPvjgA66//nq+++47AgICqFevHn369OHxxx/njz/+YOnSpTidTtq3b0+tWrV4//33+eGHH7BarRw5csTTw72qcDgcPPjgg3z++efcd9997Ny5k0OHDjFgwAB++uknwsLCCA8P5+WXXyY8PJzAwEC6dOnC/fffz4IFCzhw4ADFxcV06NCB0NBQ3nzzTebNm4fVaiU1NdXTW71a8uP14UqjqKhIPfroo6pJkyaqXbt26vPPP1dut9vfZfmUzWZTI0eOVC1btlQNGjRQV111lfr222+VrusqKytL3X///apu3bqqdevWatq0acrtdiubzaaefvpp1bJlS9WyZUs1ZcoU5XA4/L0r5bJw4ULVpUsXz8+AAQNUfn6+ys3NVePHj1e1a9dW7dq1U3PmzFG6riubzaaee+451axZM9WmTRv1wQcfKJfLpRwOh3rttddUixYtVKtWrdR///tf5XQ6/b17F23lypVljsfVV1+tjh49qsaNG6fatWunUlJS1BVXXKHmzZvn6Sx0++23q3r16qmmTZuqKVOmeI7HK6+8ourXr6+aN2+uXnrpJWW32/29exfF7Xare+65R3Xp0kV17txZdenSRY0aNUrZbDaVl5enxo8frxo1aqQ6deqkfvzxR6XrurJareqBBx5QjRs3Vpdffrnns2O329XEiRNV06ZNVaNGjdS//vUvZbPZ/L2LF6WgoEANGDDA897o3LmzGjRokLJareqVV15RLVq0ULVq1VJXXnmlWrBggdJ1XZWUlKhnnnlGNWvWTF122WXqo48+Ui6XS9ntdvXqq6+q5s2bq1atWql33nmnSn5eLpQMWHGSrutkZWURFBREaGhotb2f6xSlSqdps1qtFBcXk5CQUObakq7rHDt2jNDQUE+HkFOPn7r1KTIysspfZ/nr9IqapnmOg9vt5ujRo54OLKcfm5ycHMxmM+Hh4WUez8vLQ9M0IiIiquSxOdfxcLvdFBUVYbVaSUhI8MxQA6XXszMyMggMDCzzntB1nRMnTmAymYiOjq5yx+PUZ0T9ZYCG098fJ06cIDw8nODg4DLHIysry3OG6PT3R1ZWFgBxcXFV7jvmfMdD13Xy8/MpKCigVq1amM3mMvudnZ2NxWI54/OSm5uL0Wgs8x1THUnQCiGEED5Uff+EEEIIISoBCVohhBDCh6TXsRBVnFKKvLy8s97wf2pQiR49ehAUFOSH6oQQco1WiCpO13VGjx7N8uXL0XUdp9OJxWJB0zQ6duzIpk2bWLp0KXXq1PF3qULUSBK0QlRxSikOHjxIYWEhqamp3HPPPXzxxRfExMQAsHz5cs+g/jk5OTidTux2Ox06dCA7O5s9e/bQqFEjz0w9JSUlrF+/npKSElq3bk1SUlKV6yErRGUip46FqOI0TaN+/fqe381mM82bNychIYE9e/bwyiuvMHDgQGbNmsWkSZOoW7cuOTk5JCYm4nA4cLlcmEwmFi5cSExMDOPGjWPjxo1ERUVRWFjIl19+WSUH3xCispDOUEJUc0opz0+7du1YunQpb7/9Nvv37+eVV15hxYoVuN1uUlNT+eyzz1i+fDmffvopc+fOpWHDhnz44Yf+3gUhqjRp0QpRg6SkpBAfH0/37t2JjIykdevWREREEBAQAMC+fftwOp0888wzaJqG1WqlVatWfq5aiKpNglYI4REdHU1CQgIzZswgLi4Ot9tdrUfsEaIiyCdICOFx6623EhAQwMiRI7nzzjsZOXIkS5Ys8XdZQlRp0qIVohqJj4/nkUce8UzGHRMTwyOPPEJERARXXnklbdu2BSAiIoJHHnmE2NhYTCYTEyZMoFGjRiQnJzN//ny++uorrFYrUVFRVW6WGSEqG7m9RwghhPAhOXUshBBC+JAErRBCCOFDErRCCCGED0nQCiGEED4kQSuEEEL4kAStEEII4UMStEIIIYQPSdAKIYQQPiRBK4QQQviQBK0QQgjhQxK0QgghhA9J0AohhBA+JEErhBBC+JAErRBCCOFDErRCCCGED0nQCiGEED70/wHJK9KmYT8SNwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "genes = pd.read_csv(\"gene_perturbation.csv\", usecols=[0]).iloc[:, 0].tolist()\n", "Survival('./dataset/PAAD_processed_bulk.csv',genes)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.20" } }, "nbformat": 4, "nbformat_minor": 5 }