From 3cb9cbb373e9f046afb9a862f1f2be8ffee61cc5 Mon Sep 17 00:00:00 2001
From: pilavciy <yusuf-yigit.pilavci@grenoble-inp.fr>
Date: Fri, 15 Mar 2024 10:13:35 +0100
Subject: [PATCH] clean up

---
 .../Untitled-checkpoint.ipynb                 | 139 ------------------
 denoising-plots/.vscode/settings.json         |   1 -
 .../__pycache__/utils.cpython-310.pyc         | Bin 9303 -> 0 bytes
 .../__pycache__/utils.cpython-311.pyc         | Bin 25065 -> 0 bytes
 4 files changed, 140 deletions(-)
 delete mode 100644 denoising-plots/.ipynb_checkpoints/Untitled-checkpoint.ipynb
 delete mode 100644 denoising-plots/.vscode/settings.json
 delete mode 100644 denoising-plots/__pycache__/utils.cpython-310.pyc
 delete mode 100644 denoising-plots/__pycache__/utils.cpython-311.pyc

diff --git a/denoising-plots/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/denoising-plots/.ipynb_checkpoints/Untitled-checkpoint.ipynb
deleted file mode 100644
index 2d4751c..0000000
--- a/denoising-plots/.ipynb_checkpoints/Untitled-checkpoint.ipynb
+++ /dev/null
@@ -1,139 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "f5605c04",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "import numpy as np\n",
-    "import scipy\n",
-    "import matplotlib.pyplot as plt\n",
-    "import quaternion  # load the quaternion module\n",
-    "import bispy as bsp\n",
-    "import torch\n",
-    "import tqdm\n",
-    "import time\n",
-    "from sklearn.preprocessing import normalize\n",
-    "from utils import STIS,optimize_loop,snr_bivariate,param_search,objective_STIS,objective_KReSP,KReSP\n",
-    "from ray import  tune,init\n",
-    "from tempfile import TemporaryFile\n",
-    "import pickle\n",
-    "\n",
-    "init(num_cpus=13)\n",
-    "\n",
-    "## PLOT AN EXAMPLE \n",
-    "\n",
-    "np.random.seed(5)\n",
-    "N = 1024 # length of the signal\n",
-    "t = np.linspace(0, 2*np.pi/4, N) # time vector\n",
-    "dt = t[1]-t[0]\n",
-    "\n",
-    "# ellipse parameters - AM-FM-PM polarized \n",
-    "theta1 = np.pi/4 - 2*t\n",
-    "chi1 = np.pi/16 - t\n",
-    "phi1 = 0 \n",
-    "f0 = 25/N/dt \n",
-    "S0 = bsp.utils.windows.hanning(N)\n",
-    "\n",
-    "x_quad = bsp.signals.bivariateAMFM(S0, theta1, chi1, 2*np.pi*f0*t+ phi1)\n",
-    "x = quaternion.as_float_array(x_quad)[:,:2]\n",
-    "\n",
-    "bsp.utils.visual.plot2D(t,x_quad)\n",
-    "plt.savefig(\"clean_sig.pdf\")\n",
-    "\n",
-    "sigma = 0.05\n",
-    "n = np.zeros([N,4])\n",
-    "noise_complex = np.random.randn(N,2)\n",
-    "y = x + noise_complex\n",
-    "\n",
-    "uH = np.imag(scipy.signal.hilbert(noise_complex[:,0]))\n",
-    "vH = np.imag(scipy.signal.hilbert(noise_complex[:,1]))\n",
-    "n[:,0] = noise_complex[:,0]\n",
-    "n[:,1] = noise_complex[:,1]\n",
-    "n[:,2] = uH\n",
-    "n[:,3] = vH\n",
-    "n = quaternion.from_float_array(n)\n",
-    "y_quad = sigma*n + x_quad # Noisy signal\n",
-    "\n",
-    "bsp.utils.visual.plot2D(t,y_quad)\n",
-    "plt.savefig(\"noisy_sig.pdf\")\n",
-    "n = np.random.randn(N,2)\n",
-    "y = sigma*n + x # Noisy signal\n",
-    "\n",
-    "print(\"sigma: \" + str(sigma) + \" Noise SNR: \"+  str(snr_bivariate(x,y) ) )\n",
-    "search_space = {\"x\":tune.grid_search([x]),\"t\":tune.grid_search([t]),\"y\":tune.grid_search([y]),\"lambdax\": tune.grid_search((0.1)**np.linspace(5,15,7)), \"lambdaS\":  tune.grid_search((0.1)**np.linspace(5,10,7)) , \"beta1\":tune.grid_search((0.10)**np.linspace(-2,2,5)),\"beta2\":tune.grid_search((0.10)**np.linspace(-2,2,5)),\"sigma2\":tune.grid_search([sigma**2])}\n",
-    "config = param_search(objective_STIS,search_space)\n",
-    "model = STIS(t,y,lambdax=config[\"lambdax\"],lambdaS=config[\"lambdaS\"],beta1=config[\"beta1\"],beta2=config[\"beta2\"],sigma2=sigma**2,p=2)\n",
-    "optimizer = torch.optim.Adam(model.parameters(), lr=0.01)\n",
-    "model = optimize_loop(model,optimizer,numit=1000)\n",
-    "\n",
-    "x_stis = quaternion.from_float_array(model.Xquad.detach().numpy())\n",
-    "bsp.utils.visual.plot2D(t,x_stis)\n",
-    "plt.savefig(\"denoised_via_all_terms.pdf\")\n",
-    "\n",
-    "print(\"sigma: \" + str(sigma) + \" STIS SNR: \"+  str(snr_bivariate(x,model.X.detach().numpy())))\n",
-    "\n",
-    "\n",
-    "# NO STOKES REGULARIZATION  \n",
-    "search_space = {\"x\":tune.grid_search([x]),\"t\":tune.grid_search([t]),\"y\":tune.grid_search([y]),\"lambdax\": tune.grid_search((0.1)**np.linspace(5,15,7)), \"lambdaS\":tune.grid_search([0.0]) , \"beta1\":tune.grid_search([0.0]),\"beta2\":tune.grid_search([0.0]),\"sigma2\":tune.grid_search([sigma**2])}\n",
-    "config = param_search(objective_STIS,search_space)\n",
-    "model = STIS(t,y,lambdax=config[\"lambdax\"],lambdaS=config[\"lambdaS\"],beta1=config[\"beta1\"],beta2=config[\"beta2\"],sigma2=sigma**2,p=2)\n",
-    "optimizer = torch.optim.Adam(model.parameters(), lr=0.01)\n",
-    "model = optimize_loop(model,optimizer,numit=1000)\n",
-    "\n",
-    "print(\"sigma: \" + str(sigma) + \" STIS SNR: \"+  str((snr_bivariate(x,model.X.detach().numpy()))))\n",
-    "x_stis = quaternion.from_float_array(model.Xquad.detach().numpy())\n",
-    "bsp.utils.visual.plot2D(t,x_stis)\n",
-    "plt.savefig(\"denoised_via_no_stokes.pdf\")\n",
-    "\n",
-    "# ONLY SMOOTH STOKES\n",
-    "search_space = {\"x\":tune.grid_search([x]),\"t\":tune.grid_search([t]),\"y\":tune.grid_search([y]),\"lambdax\": tune.grid_search([0.0]), \"lambdaS\":  tune.grid_search((0.1)**np.linspace(5,10,7)) , \"beta1\":tune.grid_search((0.1)**np.linspace(-2,2,7)),\"beta2\":tune.grid_search((0.1)**np.linspace(-2,2,5)),\"sigma2\":tune.grid_search([sigma**2])}\n",
-    "config = param_search(objective_STIS,search_space)\n",
-    "model = STIS(t,y,lambdax=config[\"lambdax\"],lambdaS=config[\"lambdaS\"],beta1=config[\"beta1\"],beta2=config[\"beta2\"],sigma2=sigma**2,p=2)\n",
-    "optimizer = torch.optim.Adam(model.parameters(), lr=0.01)\n",
-    "model = optimize_loop(model,optimizer,numit=1000)\n",
-    "x_stis = quaternion.from_float_array(model.Xquad.detach().numpy())\n",
-    "bsp.utils.visual.plot2D(t,x_stis)\n",
-    "plt.savefig(\"denoised_via_no_signal_smoother.pdf\")\n",
-    "\n",
-    "print(\"sigma: \" + str(sigma) +  \" STIS SNR: \"+  str((snr_bivariate(x,model.X.detach().numpy()))))\n",
-    "\n",
-    "# Kernel regression on normalized \n",
-    "search_space = {\"x\":tune.grid_search([x]),\"t\":tune.grid_search([t]),\"y\":tune.grid_search([y]),\"alpha\": tune.grid_search((0.1)**np.linspace(5,15,7)),\"lambda_1\": tune.grid_search((0.1)**np.linspace(5,15,7)), \"lambda_s\":  tune.grid_search((0.1)**np.linspace(5,10,7)) , \"beta\":tune.grid_search((0.10)**np.linspace(-2,2,7)),\"gamma\":tune.grid_search([0.2]),\"sigma2\":tune.grid_search([sigma**2])}\n",
-    "config = param_search(objective_KReSP,search_space)\n",
-    "model = KReSP(t,y,lambda_1=config[\"lambda_1\"],beta=config[\"beta\"],lambda_s=config[\"lambda_s\"],alpha=config[\"alpha\"],gamma=config[\"gamma\"],eps=10**-7,win_width=32,sigma2=sigma**2)\n",
-    "optimizer = torch.optim.Adam(model.parameters(), lr=0.01)\n",
-    "model = optimize_loop(model,optimizer,numit=300)\n",
-    "\n",
-    "\n",
-    "print(\"sigma: \" + str(sigma) + \" KReSP SNR: \"+  str(snr_bivariate(x,model.X.detach().numpy())))\n",
-    "x_kerreg = quaternion.from_float_array(model.Xquad.detach().numpy())\n",
-    "bsp.utils.visual.plot2D(t,x_kerreg)\n",
-    "plt.savefig(\"denoised_via_kerreg.pdf\")"
-   ]
-  }
- ],
- "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.11.3"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/denoising-plots/.vscode/settings.json b/denoising-plots/.vscode/settings.json
deleted file mode 100644
index 9e26dfe..0000000
--- a/denoising-plots/.vscode/settings.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/denoising-plots/__pycache__/utils.cpython-310.pyc b/denoising-plots/__pycache__/utils.cpython-310.pyc
deleted file mode 100644
index e849215aeb954d30eeab762af367b765ff57cd5a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9303
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
KIfOX4#CQP}r0Bl@

diff --git a/denoising-plots/__pycache__/utils.cpython-311.pyc b/denoising-plots/__pycache__/utils.cpython-311.pyc
deleted file mode 100644
index 114ceef33bc818fe6e5258e6e708523aedb6f567..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 25065
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
XMQw%P3g!*29~i_LV;J$1;HUrq|DUPJ

-- 
GitLab