# Geometric programming

A geometric program (GP) is an optimization problem of the form

Minimize ${\displaystyle \ f_{0}(x)\ }$ subject to
${\displaystyle f_{i}(x)\leq 1,\quad i=1,\dots ,m}$
${\displaystyle h_{i}(x)=1,\quad i=1,\dots ,p}$
where ${\displaystyle f_{0},\dots ,f_{m}}$ are posynomials and ${\displaystyle h_{1},\dots ,h_{p}}$ are monomials.

In the context of geometric programming (unlike all other disciplines), a monomial is defined as a function ${\displaystyle h:\mathbb {R} _{++}^{n}\to \mathbb {R} }$ defined as

${\displaystyle h(x)=cx_{1}^{a_{1}}x_{2}^{a_{2}}\cdots x_{n}^{a_{n}}}$

where ${\displaystyle c>0\ }$ and ${\displaystyle a_{i}\in \mathbb {R} }$.

GPs have numerous application, such as components sizing in IC design[1] and parameter estimation via logistic regression in statistics. The maximum likelihood estimator in logistic regression is a GP.

## Convex form

Geometric programs are not (in general) convex optimization problems, but they can be transformed to convex problems by a change of variables and a transformation of the objective and constraint functions. In particular, defining ${\displaystyle y_{i}=\log(x_{i})}$, the monomial ${\displaystyle f(x)=cx_{1}^{a_{1}}\cdots x_{n}^{a_{n}}\mapsto e^{a^{T}y+b}}$, where ${\displaystyle b=\log(c)}$. Similarly, if ${\displaystyle f}$ is the posynomial

${\displaystyle f(x)=\sum _{k=1}^{K}c_{k}x_{1}^{a_{1k}}\cdots x_{n}^{a_{nk}}}$

then ${\displaystyle f(x)=\sum _{k=1}^{K}e^{a_{k}^{T}y+b_{k}}}$, where ${\displaystyle a_{k}=(a_{1k},\dots ,a_{nk})}$ and ${\displaystyle b_{k}=\log(c_{k})}$. After the change of variables, a posynomial becomes a sum of exponentials of affine functions.

## Software

Several software packages and libraries exist to assist with formulating and solving geometric programs.

• MOSEK is a commercial solver capable of solving geometric programs as well as other non-linear optimization problems.
• CVXOPT is an open-source solver for convex optimization problems.
• GPkit is a Python package for cleanly defining and manipulating geometric programming models. There are a number of example GP models written with this package here.