#!/usr/bin/python3

# pip install ortools
# https://pypi.org/project/ortools/
from ortools.constraint_solver import pywrapcp

def main():
  solver = pywrapcp.Solver("PE_142")

  max_limit=1000000
  max_limit_sqr=(max_limit*2)**2

  x=solver.IntVar(0, max_limit, "x")
  y=solver.IntVar(0, max_limit, "y")
  z=solver.IntVar(0, max_limit, "z")
  a1=solver.IntVar(0, max_limit_sqr, "a1")
  a2=solver.IntVar(0, max_limit_sqr, "a2")
  a3=solver.IntVar(0, max_limit_sqr, "a3")
  a4=solver.IntVar(0, max_limit_sqr, "a4")
  a5=solver.IntVar(0, max_limit_sqr, "a5")
  a6=solver.IntVar(0, max_limit_sqr, "a6")

  solver.Add(x>y)
  solver.Add(y>z)
  solver.Add(z>0)
  solver.Add(a1>0)
  solver.Add(a2>0)
  solver.Add(a3>0)
  solver.Add(a4>0)
  solver.Add(a5>0)
  solver.Add(a6>0)
  solver.Add(x + y == a1*a1)
  solver.Add(x - y == a2*a2)
  solver.Add(x + z == a3*a3)
  solver.Add(x - z == a4*a4)
  solver.Add(y + z == a5*a5)
  solver.Add(y - z == a6*a6)

  # objective
  objective = solver.Minimize(x+z+y, 1)

  solution = solver.Assignment()

  db = solver.Phase([x,y,z],
                    solver.CHOOSE_MIN_SIZE_LOWEST_MAX,
                    solver.ASSIGN_MIN_VALUE)

  solver.NewSearch(db, [objective])
  assert solver.NextSolution()==True
  print("x: ", x.Value())
  print("y: ", y.Value())
  print("z: ", z.Value())
  print()
  solver.EndSearch()

  print("failures:", solver.Failures())
  print("branches:", solver.Branches())
  print("WallTime:", solver.WallTime())

main()

