{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Homework" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We solve the image reconstruction problem, but this time using `JuMP`. We are given a noisy image, and we want to clean the image up. " ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "128×128 Array{Gray{N0f8},2} with eltype Gray{N0f8}:\n", " Gray{N0f8}(0.0) Gray{N0f8}(0.0) … Gray{N0f8}(0.627)\n", " Gray{N0f8}(0.627) Gray{N0f8}(0.624) Gray{N0f8}(0.388)\n", " Gray{N0f8}(0.612) Gray{N0f8}(0.612) Gray{N0f8}(0.0)\n", " Gray{N0f8}(0.0) Gray{N0f8}(0.0) Gray{N0f8}(0.192)\n", " Gray{N0f8}(0.612) Gray{N0f8}(0.0) Gray{N0f8}(0.0)\n", " Gray{N0f8}(0.0) Gray{N0f8}(0.0) … Gray{N0f8}(0.2)\n", " Gray{N0f8}(0.608) Gray{N0f8}(0.0) Gray{N0f8}(0.0)\n", " Gray{N0f8}(0.0) Gray{N0f8}(0.0) Gray{N0f8}(0.216)\n", " Gray{N0f8}(0.62) Gray{N0f8}(0.62) Gray{N0f8}(0.208)\n", " Gray{N0f8}(0.0) Gray{N0f8}(0.0) Gray{N0f8}(0.188)\n", " Gray{N0f8}(0.635) Gray{N0f8}(0.0) … Gray{N0f8}(0.0)\n", " Gray{N0f8}(0.631) Gray{N0f8}(0.0) Gray{N0f8}(0.0)\n", " Gray{N0f8}(0.0) Gray{N0f8}(0.627) Gray{N0f8}(0.184)\n", " ⋮ ⋱ \n", " Gray{N0f8}(0.0) Gray{N0f8}(0.129) Gray{N0f8}(0.0)\n", " Gray{N0f8}(0.149) Gray{N0f8}(0.129) Gray{N0f8}(0.0)\n", " Gray{N0f8}(0.216) Gray{N0f8}(0.0) Gray{N0f8}(0.208)\n", " Gray{N0f8}(0.345) Gray{N0f8}(0.341) Gray{N0f8}(0.231)\n", " Gray{N0f8}(0.0) Gray{N0f8}(0.0) … Gray{N0f8}(0.259)\n", " Gray{N0f8}(0.298) Gray{N0f8}(0.416) Gray{N0f8}(0.259)\n", " Gray{N0f8}(0.0) Gray{N0f8}(0.369) Gray{N0f8}(0.235)\n", " Gray{N0f8}(0.0) Gray{N0f8}(0.0) Gray{N0f8}(0.208)\n", " Gray{N0f8}(0.22) Gray{N0f8}(0.0) Gray{N0f8}(0.2)\n", " Gray{N0f8}(0.0) Gray{N0f8}(0.22) … Gray{N0f8}(0.0)\n", " Gray{N0f8}(0.196) Gray{N0f8}(0.208) Gray{N0f8}(0.345)\n", " Gray{N0f8}(0.192) Gray{N0f8}(0.0) Gray{N0f8}(0.0)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using Images\n", "lenna = load(\"img//lena128missing.png\") \n", "# put the image lena128missing.png in the same folder, where your julia file or ipynb file resides" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# convert to real matrices\n", "Y = Float64.(lenna);" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "observed_entries_Y = findall(x->x!=0.0, Y);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We want to solve:\n", "\n", "\\begin{array}{ll}\n", "\\underset{X}{\\mbox{minimize}} & \\| X \\|_\\star \\\\\n", "\\mbox{subject to} & X_{i,j}=Y_{i,j},\\quad(i,j)\\in\\text{observed pixels of }Y \\quad \\textsf{(OPT)}\n", "\\end{array}\n", "\n", "The problem above can be formulated as an SDP. This time we will use `JuMP`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To that goal, use the result from [Lemma 1 Fazel et. al. (2001)] ([paper here](https://web.stanford.edu/~boyd/papers/pdf/rank_min_heur_sys_approx.pdf))\n", "\n", "$$\n", "\\left(\\|X\\|_{\\star}\\leq t\\right)\\Leftrightarrow\\begin{bmatrix}U & X\\\\\n", "X^{\\top} & V\n", "\\end{bmatrix}\\succeq0,\\mathbf{tr}(U)+\\mathbf{tr}(V)\\leq2t.\n", "$$\n", "\n", "By introducing a new variable, write the optimization problem (OPT) in a way so that you can apply the result above directly.\n", "\n", "Next, use the `JuMP` syntax to encode positive-semidefiniteness of a matrix $X\\succeq 0$ as:\n", "\n", "$X \\succeq 0 \\equiv$ `Symmetric(X) in PSDCone()` (put this in a Constraint)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### But, I never solved an SDP in JuMP before 😟\n", "Consider the following SDP:\n", "\n", "\\begin{array}{ll} \\text{minimize} & \\text{tr}(CX)\\\\\n", "\\text{subject to} & \\text{tr}(A X) = b \\\\\n", " & X \\succeq 0,\n", "\\end{array}\n", "\n", "where\n", "\n", "$A = \\begin{bmatrix} 1 & 5 \\\\ 5 & 2\\end{bmatrix},$\n", "$C = \\begin{bmatrix} 1 & 2 \\\\ 2 & 2\\end{bmatrix},$\n", "$b = 4.$\n", "\n", "You can solve this in `JuMP` with the following code:\n", "\n", "```\n", "using JuMP, Mosek, MosekTools, LinearAlgebra\n", "# if M1 chip, then\n", "# using COSMO, JuMP, LinearAlgebra\n", "\n", "C = [1. 2; 2 2]\n", "A = [1. 5; 5 2]\n", "b = 4.0;\n", "\n", "m = Model(with_optimizer(COSMO.Optimizer));\n", "@variable(m, X[1:2, 1:2], PSD)\n", "@objective(m, Min, tr(C * X));\n", "@constraint(m, tr(A * X) == b);\n", "JuMP.optimize!(m);\n", "\n", "status = JuMP.termination_status(m)\n", "X_sol = JuMP.value.(X)\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Now solve (OPT) using `JuMP`\n", "\n", "* Provide the `JuMP` code\n", "* After solving the problem using `JuMP`, please provide the trace of the optimal solution. For example, if `X_sol` is the solution matrix, then what is `tr(X_sol)`?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.6.1", "language": "julia", "name": "julia-1.6" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.6.1" } }, "nbformat": 4, "nbformat_minor": 4 }