# Expression Examples

import flopt


## 1. $$f = \sum_i x_i$$

x = flopt.Variable.array("x", 4)
f = flopt.sum(x)

print(f)
>>> Name: x_0+x_1+x_2+x_3
>>> Type    : Normal
>>> Value   : 0.0


## 2. $$f = \sum_i \sum_j x_i x_j$$

import itertools

x = flopt.Variable.array("x", 4)
f = flopt.sum(xi * xj for xi, xj in itertools.product(x, x))

print(f)
>>> Name: x_0*x_0+(x_0*x_1)+(x_0*x_2)+(x_0*x_3)+(x_1*x_0)+(x_1*x_1)+(x_1*x_2)+(x_1*x_3)+(x_2*x_0)+(x_2*x_1)+(x_2*x_2)+(x_2*x_3)+(x_3*x_0)+(x_3*x_1)+(x_3*x_2)+(x_3*x_3)
>>>   Type    : Normal
>>>   Value   : 0.0

x = flopt.Variable.array("x", (4, 1))
f = flopt.sum(x.dot(x.T))

print(f)
>>> Name: x_0_0*x_0_0+(x_0_0*x_1_0)+(x_0_0*x_2_0)+(x_0_0*x_3_0)+(x_1_0*x_0_0)+(x_1_0*x_1_0)+(x_1_0*x_2_0)+(x_1_0*x_3_0)+(x_2_0*x_0_0)+(x_2_0*x_1_0)+(x_2_0*x_2_0)+(x_2_0*x_3_0)+(x_3_0*x_0_0)+(x_3_0*x_1_0)+(x_3_0*x_2_0)+(x_3_0*x_3_0)
>>>   Type    : Normal
>>>   Value   : 0.0


## 3. $$f = \sum_i \left( \sum_j x_{ij} -1 \right) ^2$$

x = flopt.Variable.matrix("x", 2, 2)
f = flopt.sum((flopt.sum(xi) - 1) ** 2 for xi in x)

print(f)
>>> Name: (x_0_0+x_0_1-1)^2+((x_1_0+x_1_1-1)^2)
>>>   Type    : Normal
>>>   Value   : 2.0


## 4. $$f = \sum_{i \neq j}x_i x_j$$

import itertools

x = flopt.Variable.array("x", 4)
f = flopt.sum(xi * xj for xi, xj in itertools.combinations(x, 2))

print(f)
>>> Name: x_0*x_1+(x_0*x_2)+(x_0*x_3)+(x_1*x_2)+(x_1*x_3)+(x_2*x_3)
>>>   Type    : Normal
>>>   Value   : 0.0


## 5. $$f = \prod_i x_i$$

x = flopt.Variable.array("x", 4)
f = flopt.prod(x)

print(f)
>>> Name: ((x_0*x_1)*x_2)*x_3
>>>   Type    : Normal
>>>   Value   : 0.0


## Show a calculation graph

You can easily see the calculation graphs of expressions by using get_dot_graph

import itertools

x = flopt.flopt.Variable.array("x", 3)
f = flopt.flopt.sum(xi * xj for xi, xj in itertools.product(x, x))
save_path = "tmp.txt"
flopt.get_dot_graph(f, save_path)


In addition, you execute Graphviz command.

dot tmp.txt -T png -o tmp.png