{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "start_time": "2018-12-21T04:24:55.135Z" }, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "==============================\n", "Epoch #:1\n", "==============================\n", "----------------- I-1---------------------\n", "19 7.228902561084357\n" ] } ], "source": [ "%reload_ext autoreload\n", "%autoreload 2\n", "import warnings\n", "warnings.filterwarnings(\"ignore\",category =RuntimeWarning)\n", "import numpy as np\n", "import de2 as de\n", "import multiprocessing as mp\n", "import makeqx as mkq\n", "import oldqx as oqx\n", "\n", "\n", "# anti-reflection coating\n", "R_ref = np.linspace(100.0, 100.0, endpoint=True, num=50)\n", "# narrow band transmission filter\n", "R_ref[17] = 0.0\n", "\n", "\n", "def rndtop5(x):\n", " return np.round(x*2.0)/2\n", "\n", "def tmm_wrapper2(arg):\n", " args, kwargs = arg\n", " return oqx.tmm_eval_wsweep(*args, **kwargs)\n", "\n", "def arc_par(pop, **kwargs):\n", " jobs = []\n", " pool=mp.Pool(90)\n", " for indiv in pop:\n", " #indiv = indiv.reshape((int(indiv.size/2), 2))\n", " #indiv[:,1] = mkq.digitize_qx(indiv[:,1], dlevels=2)\n", " indiv = rndtop5(indiv)\n", " #indiv = indiv.flatten()\n", " jobs.append((indiv, 0))\n", " arg = [(j, kwargs) for j in jobs]\n", " answ = np.array(pool.map(tmm_wrapper2, arg))\n", " pool.close()\n", " \n", " answref = np.tile(R_ref, (answ.shape[0], 1)) \n", " \n", "# print(np.abs(answ - answref))\n", "# print ( np.mean(np.abs(answ - answref)))\n", " \n", " c1 = np.mean(np.abs(answref - answ), axis=1)\n", " c2 = np.zeros_like(c1)\n", " for idx, indiv in enumerate(pop):\n", " c2[idx] = np.sum(indiv)\n", " if c2[idx] <= 385:\n", " c2[idx] = 385/c2[idx]\n", " else:\n", " c2[idx] = 0.0\n", " return c1\n", "\n", "\n", "num_layers = 20\n", "d_min = 0\n", "d_max = 105\n", "\n", "bnds = [(d_min, d_max)]*num_layers\n", "its_first = 0\n", "psnew = 5*num_layers\n", "islands = 5\n", "its_second = 256\n", "numgens = 5\n", "\n", "isl = np.ones((psnew*islands, num_layers))\n", "for indiv in range(int(psnew*islands)):\n", " isl[indiv] = np.random.uniform(0,1, num_layers)\n", " #isl[indiv] = qn.make_qxn(num_layers, dlevels=2)\n", "poplist = np.split(isl, islands)\n", "\n", "bids = np.zeros(islands, dtype=int)\n", "bfits = np.zeros(islands)\n", "bests = isl[0:islands]\n", "\n", "for gen in range(numgens):\n", " print(\"==============================\")\n", " print(\"Epoch #:\" + str(gen + 1))\n", " print(\"==============================\")\n", " \n", " for isln in range(islands):\n", " print(\"----------------- I-\" + str(isln + 1)+ \"---------------------\")\n", " poplist[isln], bids[isln], bfits[isln], bests[isln] = de.de_cp(\n", " fobj=arc_par, \n", " bounds=bnds, \n", " pop=poplist[isln], \n", " history=[], \n", " it_start=its_first, \n", " popsize=psnew, \n", " its=its_second, \n", " lam_low=400, \n", " lam_high=800, \n", " lam_pts=50)\n", " print(np.sum(bests[isln]))\n", " \n", " if its_second > 64:\n", " its_second = int(its_second/2)\n", " \n", " if gen < (numgens - 1):\n", " print(\"Round robin best migration\")\n", " stmp = np.copy(poplist[islands-1][bids[islands-1]])\n", " for isln in range(1, islands):\n", " poplist[isln][bids[isln]] = poplist[isln-1][bids[isln-1]]\n", " poplist[0][bids[0]] = stmp \n", " \n", "print(bfits) \n", "print(bests[np.argmin(bfits)])\n", "\n", "print(np.sum(bests[np.argmin(bfits)]))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-12-20T09:49:19.294405Z", "start_time": "2018-12-20T09:49:18.648339Z" } }, "outputs": [], "source": [ "arc_par(poplist[0\n", " \n", " \n", " ])" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "ExecuteTime": { "end_time": "2018-12-21T04:24:15.138603Z", "start_time": "2018-12-21T04:24:14.862749Z" } }, "outputs": [ { "data": { "text/plain": [ "(400, 800)" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from jupyterthemes import jtplot\n", "# currently installed theme will be used to\n", "# set plot style if no arguments provided\n", "jtplot.style()\n", "\n", "Rs = oqx.tmm_eval_wsweep(rndtop5(bests[np.argmin(bfits)]),0, lam_pts=50)\n", "\n", "#Rs = qn.tmm_eval_wsweep(qx, d_min=2 , d_max=10, inc_ang=0, lam_low=400, lam_high=800, lam_pts=50, n_subs=1.52) # in nm\n", "lams = np.linspace(400, 800, endpoint=True, num=50)\n", "\n", "meanl = np.ones_like(lams)*np.mean(oqx.tmm_eval_wsweep(rndtop5(bests[np.argmin(bfits)]),0))\n", "plt.plot(lams, Rs )\n", "plt.plot(lams, R_ref)\n", "plt.xlabel('Wavelength (nm)')\n", "plt.ylabel('Reflectance (%)')\n", "plt.ylim([0,100])\n", "plt.xlim([400,800])\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2018-12-20T10:02:30.999401Z", "start_time": "2018-12-20T10:02:30.962391Z" } }, "outputs": [ { "data": { "text/plain": [ "array([400. , 408.16326531, 416.32653061, 424.48979592,\n", " 432.65306122, 440.81632653, 448.97959184, 457.14285714,\n", " 465.30612245, 473.46938776, 481.63265306, 489.79591837,\n", " 497.95918367, 506.12244898, 514.28571429, 522.44897959,\n", " 530.6122449 , 538.7755102 , 546.93877551, 555.10204082,\n", " 563.26530612, 571.42857143, 579.59183673, 587.75510204,\n", " 595.91836735, 604.08163265, 612.24489796, 620.40816327,\n", " 628.57142857, 636.73469388, 644.89795918, 653.06122449,\n", " 661.2244898 , 669.3877551 , 677.55102041, 685.71428571,\n", " 693.87755102, 702.04081633, 710.20408163, 718.36734694,\n", " 726.53061224, 734.69387755, 742.85714286, 751.02040816,\n", " 759.18367347, 767.34693878, 775.51020408, 783.67346939,\n", " 791.83673469, 800. ])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "R_ref = np.linspace(400.0, 800.0, endpoint=True, num=50)\n", "# narrow band transmission filter\n", "#R_ref[0:83] = 0.0\n", "R_ref" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-12-08T17:35:57.288922Z", "start_time": "2018-12-08T17:13:28.915427Z" } }, "outputs": [], "source": [ "%reload_ext autoreload\n", "%autoreload 2\n", "import warnings\n", "warnings.filterwarnings(\"ignore\",category =RuntimeWarning)\n", "import numpy as np\n", "import de2 as de\n", "import multiprocessing as mp\n", "import makeqx as mkq\n", "import qxnew as qn \n", "\n", "def rndtop5(x):\n", " return np.round(x*2.0)/2\n", "\n", "def tmm_wrapper2(arg):\n", " args, kwargs = arg\n", " return qn.tmm_eval_wsweep(*args, **kwargs)\n", "\n", "def arc_par(pop, **kwargs):\n", " jobs = []\n", " pool=mp.Pool(90)\n", " for indiv in pop:\n", " indiv = indiv.reshape((int(indiv.size/2), 2))\n", " indiv[:,1] = mkq.digitize_qx(indiv[:,1], dlevels=2)\n", " indiv[:,0] = rndtop5(indiv[:,0])\n", " indiv = indiv.flatten()\n", " jobs.append((indiv, 0, 1, 0))\n", " arg = [(j, kwargs) for j in jobs]\n", " answ = np.array(pool.map(tmm_wrapper2, arg))\n", " pool.close()\n", " \n", " c1 = np.mean(answ, axis=1)\n", " c2 = np.zeros_like(c1)\n", " for idx, indiv in enumerate(pop):\n", " c2[idx] = np.sum(indiv[::2])\n", " if c2[idx] <= 480:\n", " c2[idx] = 480/c2[idx]\n", " else:\n", " c2[idx] = 0.0\n", " return c1\n", "\n", " \n", "num_layers = 25\n", "d_min = 0.5\n", "d_max = 20 \n", "\n", "bnds = [(d_min, d_max), (0,1)]*num_layers\n", "its_first = 0\n", "psnew = 40\n", "islands = 9\n", "its_second = 256\n", "numgens = 5\n", "\n", "isl = np.ones((psnew*islands, 2*num_layers))\n", "for indiv in range(int(psnew*islands)):\n", " isl[indiv] = np.random.uniform(0,1, 2*num_layers)\n", " #isl[indiv] = qn.make_qxn(num_layers, dlevels=2)\n", "poplist = np.split(isl, islands)\n", "\n", "bids = np.zeros(islands, dtype=int)\n", "bfits = np.zeros(islands)\n", "bests = isl[0:islands]\n", "\n", "\n", "for gen in range(numgens):\n", " print(\"==============================\")\n", " print(\"Epoch #:\" + str(gen + 1))\n", " print(\"==============================\")\n", " \n", " for isln in range(islands):\n", " print(\"----------------- I-\" + str(isln + 1)+ \"---------------------\")\n", " poplist[isln], bids[isln], bfits[isln], bests[isln] = de.de_cp(\n", " fobj=arc_par, \n", " bounds=bnds, \n", " pop=poplist[isln], \n", " history=[], \n", " it_start=its_first, \n", " popsize=psnew, \n", " its=its_second, \n", " lam_low=400, \n", " lam_high=800, \n", " lam_pts=50)\n", " print(np.sum(bests[isln][::2]))\n", " \n", " if its_second > 64:\n", " its_second = int(its_second/2)\n", " \n", " if gen < (numgens - 1):\n", " print(\"Round robin best migration\")\n", " stmp = np.copy(poplist[islands-1][bids[islands-1]])\n", " for isln in range(1, islands):\n", " poplist[isln][bids[isln]] = poplist[isln-1][bids[isln-1]]\n", " poplist[0][bids[0]] = stmp \n", " \n", "print(bfits) \n", "print(bests[np.argmin(bfits)][::2])\n", "print(bests[np.argmin(bfits)][1::2])\n", "print(np.sum(bests[np.argmin(bfits)][::2]))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-12-02T16:56:30.208676Z", "start_time": "2018-12-02T16:56:30.117250Z" } }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from jupyterthemes import jtplot\n", "# currently installed theme will be used to\n", "# set plot style if no arguments provided\n", "jtplot.style()\n", "bri = bests[np.argmin(bfits)][1::2]\n", "brx = bests[np.argmin(bfits)][::2]\n", "xarr = np.cumsum(brx)\n", "print(bri)\n", "# plt.plot(xarr, bri)\n", "# plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-11-27T12:04:52.963380Z", "start_time": "2018-11-27T12:04:52.942435Z" } }, "outputs": [], "source": [ "def rndtop5(x):\n", " return np.round(x*2.0)/2\n", "rndtop5(1.63)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-12-20T08:01:38.243818Z", "start_time": "2018-12-20T08:01:38.177561Z" } }, "outputs": [], "source": [ "lams" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-12-20T08:03:54.562143Z", "start_time": "2018-12-20T08:03:54.497758Z" } }, "outputs": [], "source": [ "lams[88]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.0" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false } }, "nbformat": 4, "nbformat_minor": 2 }