{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%writefile learners_file.py\n",
    "\n",
    "import adaptive\n",
    "\n",
    "import phase_diagram\n",
    "lead_pars = dict(\n",
    "    a=10, r1=50, r2=70, coverage_angle=135, angle=45, with_shell=True, which_lead=\"\"\n",
    ")\n",
    "\n",
    "params = dict(\n",
    "    alpha=20,\n",
    "    B_x=0,\n",
    "    B_y=0,\n",
    "    B_z=0,\n",
    "    Delta=110,\n",
    "    g=50,\n",
    "    orbital=True,\n",
    "    mu_sc=100,\n",
    "    c_tunnel=3 / 4,\n",
    "    V_r=-50,\n",
    "    intrinsic_sc=False,\n",
    "    mu_=lambda x0, sigma, mu_lead, mu_wire: mu_lead,\n",
    "    V_=lambda z, V_0, V_r, V_l, x0, sigma, r1: 0,\n",
    "    V_0=None,\n",
    "    V_l=None,\n",
    "    mu_lead=10,\n",
    "    mu_wire=None,\n",
    "    r1=None,\n",
    "    sigma=None,\n",
    "    x0=None,\n",
    "    **phase_diagram.constants.__dict__\n",
    ")\n",
    "\n",
    "\n",
    "def pf(xy, params=params, lead_pars=lead_pars):\n",
    "    import phase_diagram \n",
    "\n",
    "    params[\"B_x\"], params[\"mu_lead\"] = xy\n",
    "    lead = phase_diagram.make_lead(**lead_pars).finalized()\n",
    "    return phase_diagram.calculate_pfaffian(lead, params)\n",
    "\n",
    "\n",
    "def smallest_gap(xy, params=params, lead_pars=lead_pars):\n",
    "    import phase_diagram\n",
    "\n",
    "    params[\"B_x\"], params[\"mu_lead\"] = xy\n",
    "    lead = phase_diagram.make_lead(**lead_pars).finalized()\n",
    "    pf = phase_diagram.calculate_pfaffian(lead, params)\n",
    "    gap = phase_diagram.gap_from_modes(lead, params)\n",
    "    return pf * gap\n",
    "\n",
    "fname = 'phase_diagram_gap.pickle'\n",
    "# fname = 'phase_diagram.pickle'\n",
    "\n",
    "loss = adaptive.learner.learnerND.curvature_loss_function()\n",
    "learner = adaptive.LearnerND(smallest_gap, bounds=[(0, 2), (0, 35)], loss_per_simplex=loss)\n",
    "\n",
    "# learner.load(fname)\n",
    "\n",
    "learners = [learner]\n",
    "fnames = [fname]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import adaptive\n",
    "adaptive.notebook_extension()\n",
    "runner = adaptive.Runner(learner, goal=lambda l: l.npoints > 60000)\n",
    "runner.live_info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%output size=100\n",
    "learner.plot(tri_alpha=0.4, n=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learner.save(fname)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import adaptive_scheduler\n",
    "\n",
    "def goal(learner):\n",
    "    return learner.npoints > 200\n",
    "\n",
    "scheduler = adaptive_scheduler.scheduler.DefaultScheduler(\n",
    "    cores=100,\n",
    "    executor_type=\"ipyparallel\",\n",
    ")  # PBS or SLURM\n",
    "\n",
    "run_manager = adaptive_scheduler.server_support.RunManager(\n",
    "    scheduler=scheduler,\n",
    "    learners_file=\"learners_file.py\",\n",
    "    goal=goal,\n",
    "    log_interval=30,\n",
    "    save_interval=30,\n",
    "    job_name='phase-diagram'\n",
    ")\n",
    "run_manager.start()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python",
   "pygments_lexer": "ipython3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}