Z3 Python y concurrent.futures

votos
0

Quiero resolver un conjunto de problemas que figuran en paralelo, después de lo cual se añade la información, además de resolver un nuevo problema.

A continuación se muestra un ejemplo de la estructura del programa que se utiliza para resolver el problema:

from z3 import *
import concurrent.futures


# solver test function
def add(a, b, solver, index):
    solver.append(a > b)
    assert solver.check()
    model = solver.model()
    return {
        'solver': solver,
        'av': model[a],
        'a': a,
        'b': b,
        'bv': model[b],
        'index': index
    }


with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    # start solving the problems
    to_compute = []
    for i in range(3):
        sol = z3.Solver()
        to_compute.append(executor.submit(
            add,
            Int('a{}'.format(i)),
            Int('b{}'.format(i)),
            sol,
            i
        ))
    # wait for the solution to the computations
    next_to_solve = []
    for result_futures in concurrent.futures.as_completed(to_compute):
        results = result_futures.result()
        print(results)
        sol = results['solver']
        sol.append(results['a'] > results['av'])
        next_to_solve.append(
            executor.submit(
                add,
                results['a'],
                results['b'],
                sol,
                results['index']
            )
        )

El resultado es diferente cada vez que se ejecuta el programa, los resultados incluyen:

  • Z3Exception 'no válido comando dec_ref'
  • Python que accidente
  • No hay error

¿Qué necesito para hacer, para que el programa sea más fiable?

Publicado el 19/09/2018 a las 13:20
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
1

¿Has visto este ejemplo: http://github.com/Z3Prover/z3/blob/master/examples/python/parallel.py

No soy un experto en las características concurrentes en z3py, pero parece ser que necesita ser muy cuidadoso en crear las variables en el mismo contexto que se está ejecutando el solucionadores. Hay algunos indicios en ese mismo archivo.

Respondida el 22/09/2018 a las 21:16
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more