mixingcut 0.1.1

A program to solve the MAXCUT SDP Relaxation.
Documentation
# MixingCut Solver

MixingCut is a solver for the MaxCut SDP relaxation via mixing cut algorithm proposed by Po-Wei Wang et al [1]. This 
can solve general large scale instances of the MaxCut SDP relaxation problem.

$$
\begin{align*}
\min_{X} &\text{tr}(QX) \\
s.t. &X_{ii} = 1\\
&X \succeq 0
\end{align*}
$$

# Usage


The solver can be used via the command line with the following interface:

```bash
./mixingcut \
    --input-path <input_file> \
    --output-path <output_file> \
    --rank <rank> \
    --tolerance <tolerance> \
    --max-iters <max_iter> \
    --index-correction <index-correction> \
    --step-rule <step_rule> \
    --dual-bound <dual_bound> \
    --verbose <verbose> \
    --rounding-iters <rounding_iters>
```

Where:
- `<input_file>` is the path to the file containing the input data for the matrix ``Q``. 
- `<output_file>` is the path to the file where the output will be written. Default is ``output.txt``.
- `<rank>` is the rank of the low rank approximation, and ``rank = 0`` selects ``2log2(n)``, and ``rank = 1`` 
  selects ``sqrt(2n)`` as the rank. Default is ``0`` 
- `<tolerance>` is the tolerance for the stopping criterion between iterations. If the objective improvement is less 
  than this number, solver termination occures. Default is ``1e-2``. 
- `<max_iter>` is the maximum number of iterations. Default is ``1000``.
- `<step_rule>` is the update rule for the mixing cut algorithm. Default is ``coord_no_step``. Options are ``grad``, 
  ``grad_adv``, ``coord`` and ``coord_no_step``. 
- `<index_correction>` is for reading the input graph file, if the vertices are 0-indexed or 1-indexed. Default is 
  ``1``. 
- `<dual_bound>` is the flag for computing the dual bound for the SDP relaxation. Default is ``0``. A value of ``1`` 
  will compute the dual bound (this is an expensive(non computable) operation for large(huge) instances).  
- `<verbose>` is the flag for printing the output to the console. Default is ``1``. To disable output set to ``0``.
- `<rounding_iters>` is the number of iterations for the rounding algorithm. Default is ``1000``.

However, only the input file is required. The solver will use the default values for the other parameters if not 
specified in the command line with the following command: 

```bash
./mixingcut --input-path <input_file>
```

# Expected File Format

The solver reads the input from a file in the following format: Where `n` is the number of vertices, `i` and `j` are 
the vertices of the edge and `q_ij` is the weight of the edge. In the case where ``q_ij`` is not specified, the 
default value is 1.

```
n
i_1 j_1 q_{i_1,j_1}
i_2 j_2 q_{i_2,j_2}
...
i_m j_m q_{i_m,j_m}
```

# Output File Format

The solver writes a rounded solution to a file in the following format: Where ``obj_sdp`` is the value of the 
SDP relaxation, ``obj_rounded_sol`` is the value of the rounded solution and `x_i` is the value of the vertex `i`. 

```
obj_sdp
obj_rounded_sol
x_0
x_1
...
x_{n-1}
```

# More Info 


MixingCut is based on the ideas proposed by the following paper:

```bibtex
@article{wang2017mixing,
	title = {The Mixing method: coordinate descent for low-rank semidefinite programming},
	author = {Po-Wei Wang and Wei-Cheng Chang and J. Zico Kolter},
	journal = {arXiv preprint arXiv:1706.00476},
	year = {2017}
}
```