We are being asked if one can use MOSEK to express a constraint of the form $$\label{eq:sumabs}\sum_i|x_i|=c$$ for some $x\in\mathbb{R}^n$ and $c\in\mathbb{R}$. This condition is non-convex; for instance for $n=1$ it is equivalent to $x=\pm c$. Such constraints appear in long-short portfolio optimization problems (see stackoverflow, paper).
The idea is to introduce a binary vector indicating the positions of positive/negative entries in $x$. Concretely, we want to split $x$ into the positive and negative part $x=s-t$ with $s,t\geq 0$.
If we know an upper bound $M$ on $s_i$ and $t_i$, then the following system:
$$\begin{align*}
0\leq s_i&\leq My_i,\\
0\leq t_i&\leq M(1-y_i),\\
& y_i\in \{0,1\}
\end{align*}$$ has the property that at most one of $s_i,t_i$ is non-zero. Indeed:
$$
\begin{align*}
s_i>0 \implies y_i=1 \implies t_i=0,\\
t_i>0 \implies y_i=0 \implies s_i=0.
\end{align*}
$$ Given that we are looking at $\sum_i|x_i|=c$ we can choose $M=c$ as an upper bound for all $|x_i|$. Then an equivalent version of the condition $\eqref{eq:sumabs}$ as a mixed-integer linear program is:
$$
\begin{align*}
x&=s-t,\\
0\leq s&\leq cy,\\
0\leq t&\leq c(1-y),\\
0\leq y&\leq 1,\\
c&=\sum_is_i+\sum_it_i,\\
& x,s,t\in\mathbb{R}^n,\ y\in\mathbb{Z}^n.\\
\end{align*}
$$
Thursday, December 1, 2016
Monday, October 10, 2016
New phone number
We have gotten a new phone number. It is
- +45 7174 9373
Also the fax number has been closed.
Monday, June 6, 2016
Improving Python API performance
Recently a MOSEK user pointed out out that sometimes the MOSEK Python API can be quite slow when it comes to input large amount of data. In particular the problem is related to the way MOSEK handles 32 and 64 bit integers.
If you use Numpy with a 64-bit Python, integer arrays will usually end up being arrays of numpy.int64 since the native Python integer is an int64.
Most MOSEK functions require arrays of numpy.int32, e.g. for variable or constraint indexing. In this case it can often significantly speed up the function call to explicitly convert the types.
To this extent is worth using numpy.array class to convert arrays of indexes to the right size: the numpy implementation is highly efficient and saves a lot of time!
The improvement is quite remarkable. However, it must be noticed that not all users will experience such an improvement. Nevertheless it is a good idea to check your code and see whether you can gain some performance.
Remember that this issue is solved in the new MOSEK 8 release.
If you use Numpy with a 64-bit Python, integer arrays will usually end up being arrays of numpy.int64 since the native Python integer is an int64.
Most MOSEK functions require arrays of numpy.int32, e.g. for variable or constraint indexing. In this case it can often significantly speed up the function call to explicitly convert the types.
To this extent is worth using numpy.array class to convert arrays of indexes to the right size: the numpy implementation is highly efficient and saves a lot of time!
Tests
To show the performance gain in Python 2.7 we implement a simple tests involving
Note we show source code without timeit instrumentation to keep it simple.
The complete testing code is available at the end of the post.
- n=1000000 variables,
- linear objective function terms and
- quadratic objective function terms.
The complete testing code is available at the end of the post.
Objective function linear coefficents.
Say we want to input the coefficients for n variables in the objective function. We can do it using Python arrays or numpy arrays instead. The code to time the running time is
We obtain the following results
- direct input: 1.113329s
- using numpy : 0.017299s
Objective function quadratic coefficients.
Say we want to input the coefficients of the linear part of the objective function. The benchmark code is
It provides the following results
- direct input: 2.239344s
- using numpy : 0.028208s
Conclusion
The MOSEK Python API converts by default 64bit integers to 32 bit ones, and this operation could introduce significant overhead. Using numpy array to convert integer arrays to 32 bit is a simple simple workaround that allows to speed up the input process significantly.
Remember that this issue is solved in the new MOSEK 8 release.
Complete code
Labels:
performance
,
Python
,
trick
Friday, May 27, 2016
MOSEK 8 beta now available!
We are happy to announce that MOSEK version 8 beta is now available for download from our web site:
Main highlights:
Main highlights:
- The conic optimizer ha been improved in many respect: pre-solving, accuracy, speed.
- The semidefinite optimizer in particular has been greatly improved in terms of accuracy and stability.
- The Fusion API is now available for Python 3 and C++.
- An automatic dualizer for conic quadratic problem is now available.
- A simple optimization server to solve problems remotely is now included.
- Linux 32bit is no more supported.
We have also updated may other part of the solver and polished its interface. The documentation has been also revised.
Want to try this new release? Download the package and get an updated license:
- Trial and academic licenses can be used with version 8 beta as well.
- Commercial users that are entitled for upgrade can contact us to obtain a new license file.
We are very much confident this new release will be a further improvement for our product.
Help us improving even more: let us know your feedback!
Do you want to know more about the new release? Contact us!
The MOSEK Team.
Labels:
beta
,
download release
Location:
Copenhagen, Denmark
Monday, April 25, 2016
Sponsorship: 2016 MIP Workshop in Coral Gables, Florida (US)
We are happy to announce that MOSEK is among the sponsors of the 2016 Mixed Integer Programming Workshop that will be held May 23rd - 26th in Coral Gables, Florida (US).
The program includes talks from many distinguished specialists in the field of mixed-integer programming both from the academic and industrial world. No doubt the level of the presentations will be outstanding.
This year MOSEK not only support the workshop as sponsor, but we are part of the Program Committee.
We look forward for such an exciting event!
The MOSEK team
The program includes talks from many distinguished specialists in the field of mixed-integer programming both from the academic and industrial world. No doubt the level of the presentations will be outstanding.
This year MOSEK not only support the workshop as sponsor, but we are part of the Program Committee.
We look forward for such an exciting event!
The MOSEK team
Location:
Copenhagen, Denmark
Monday, April 18, 2016
Sponsorship: AOO 2016 - Copenhagen (DK) - May the 3rd 2016
MOSEK is once more one of the sponsors of the Applications of Optimization 2016 day (AOO 2016), the annual meeting of the Danish Operational Research Society (DORS).
The AOO day is meant to be an occasion for all operation research practitioners to meet, exchange experiences and find new inspiration. The program includes six application oriented talks delivered by experienced OR specialists. Maritime logistic and oil industry are among the topics.
The quality of the talks and speakers, the informal atmosphere and the clear focus on practical applications make AOO a nice and fruitful day.
The meeting will be held at Industriens Hus, in the very heart of Copenhagen (DK) on May 3rd, 2016. Please check the official web site for more information.
The meeting will be held at Industriens Hus, in the very heart of Copenhagen (DK) on May 3rd, 2016. Please check the official web site for more information.
We look forward to meet all the AOO 2016 participants and speakers!
The MOSEK team.
Labels:
annual meeting
,
sponsor
,
workshop
Location:
Copenhagen, Denmark
Friday, March 4, 2016
Reformulating a non convex MINLP as MISOCP
Few weeks ago we read a nice and interesting post here.
The author took inspiration from a previous post on an open forum to show how the intuitive formulation of a simple problem can lead to a non convex MINLP when a MIQP can be used instead.
In this post we will
- show how to reformulate the proposed MIQP problem as an MISOCP,
- implement the MISOCP model using MOSEK Fusion API,
- derive a more compact MISOCP formulation and
- implement the second model using MOSEK Fusion API as well.
The problem is the following: we are given $N$ power unit (in the original post ovens) that must be used to provide a required amount $T$ of energy. Each plant contributes an amount $x_i$ of energy.
The inefficiency of each plant is given by
\[
g_i(x_i) = \left\lbrace \begin{array}{ll} 100 \sum_ i \frac{(a_i - x_i)^2}{a_i} & x_i>0,\\
0& x_i=0. \end{array}\right.
\]
where $a_i$ is the optimal operational level of the plant. Moving away from $a_i$ leads to inefficient use of the plant. Here there is an example for $a_i = 10 $.
The overall inefficiency is then
\[
f(x) = \sum_i g_i(x_i).
\]
We want to minimize the inefficiency still providing the amount $T$ of energy.
A simple approach is to use an indicator variable $y_i$ to represent the $i-$th plant activation. Assuming we know an upper bound $M_i$ to the power each plant can produce, the model takes the form
\begin{equation}
\begin{array}{lll}
\min & 100\sum_i y_i \frac{(a_i - x_i)^2}{a_i} \\
&\\
s.t. & \sum_i x_i = T\\
& x_i \leq y_i M_i & i=1, \ldots, N\\
& x_i \geq 0 & i=1, \ldots, N,
& y_i \in \{0,1 \} & i=1, \ldots, N.\\ \end{array}
\end{equation}
As noted in the original post, this is a non-convex NLP. A simple reformulation allows to remove the bilinear term $x_i y_i$:
\begin{equation}
\begin{array}{lll}
\min & \sum_i \frac{d_i^2}{a_i} \\
&\\
s.t. & \sum_i x_i = T\\
& x_i \leq y_i M_i & i=1, \ldots, N\\
& -M_i(1- y_i) \leq s_i \leq M_i(1-y_i) & i=1, \ldots, N\\
& d_i = a_i - x_i +s_i & i=1, \ldots, N\\
& x_i \geq 0 & i=1, \ldots, N,\\
& y_i \in \{0,1 \} & i=1, \ldots, N.\\ \end{array}
\end{equation}
The trick is simple: an active plant $y_i=1$ implies $s_i=0$ and therefore $d_i = a_i - x_i$. But for $y_i =0$ the slack variable $s_i$ is free, while $x_i=0$. This implies that $d_i$ is free to assume any value, and since we are minimizing its second power, it will be driven to zero as well.
In conic form the problem reads
\begin{equation}
\begin{array}{lll}
\min & t\\
&\\
s.t. & \sum_i x_i = T\\
& x_i \leq y_i M_i & i=1, \ldots, N\\
& -M_i(1- y_i) \leq s_i \leq M_i(1-y_i) & i=1, \ldots, N\\
& d_i = a_i - x_i +s_i & i=1, \ldots, N\\
& (1/2, t, d_1/\sqrt{a_1}, \ldots, d_n/\sqrt{a_N}) \in \mathcal{Q_r}\\
& x_i \geq 0 & i=1, \ldots, N,\\
& y_i \in \{0,1 \} & i=1, \ldots, N.\\ \end{array}
\end{equation}
The Fusion implementation is the following
The code is very compact and readable, no need for many comments. The only operators one may wonder about are
Now we ask: is there a more compact formulation?
- vstack - it returns an array stacking its argument vertically,
- mulElm - it performs element wise multiplications.
Now we ask: is there a more compact formulation?
The answer is yes: the purpose of the slack variables is to remove the contribution to the inefficiency that a deactivated oven will provide anyway. That contribution is simply equal to $a_i$. Therefore we only need to subtract $a_i$ if $y_i=1$.
\begin{equation}
\begin{array}{lll}
\min & t - \sum_i a_i ( 1- y_i)\\
&\\
s.t. & \sum_i x_i = T\\
& x_i \leq y_i M_i & i=1, \ldots, N\\
& (1/2, t, (a_1 -x_1)/\sqrt{a_1}, \ldots, (a_N - x_N)/\sqrt{a_N}) \in \mathcal{Q_r}\\
& x_i \geq 0 & i=1, \ldots, N,\\
& y_i \in \{0,1 \} & i=1, \ldots, N.\\ \end{array}
\end{equation}
which translates to the following code:
As one can see, the code is more compact, clean and readable. Fusion helps implementing conic optimization models in short time with a remarkable simplicity.
Last observation: the proposed problem is indeed simple to formulate, but the intuition leads to a non-convex MINLP. That is typical, but luckily in this case with a bit of work we can actually move to a MIQP formulation first, and a MISOCP then. And the final MISOCP comes with no additional variables at all.
Investing time on the model pays!
Tuesday, February 23, 2016
Personal Academic Licenses
We have recently experienced technical issues that have prevented us to provide personal academic licenses (see our recent blog post). Academic users trying to apply or renew personal academic licenses have got an error message instead.
The service is now up and running and academic users can obtain fully-featured personal academic licenses at
Please let us know if any other issues arises.
We do apologize for the inconvenience.
The MOSEK Team.
Location:
Copenhagen, Denmark
Thursday, February 4, 2016
Trial license server not working
Our academic trial license server is currently malfunctioning.
Due to a technical issue, academic license requester will get an error from our server.
The error has been introduced by a recent update.
We are working on the issue and hope to resolve it as soon as possible. In the mean time, please grab 30 days commercial trial licenses instead at
Contact us at info@mosek.com if any other issue arises.
We apologize for the inconvenience.
The MOSEK team
Subscribe to:
Posts
(
Atom
)