66import json
77import os
88import tempfile
9- from dataclasses import dataclass , field , fields
9+ from dataclasses import dataclass , field
1010from pathlib import Path
11- from typing import Any , Dict , Iterator , List , Optional , Set , Tuple
11+ from typing import Iterator , List , Optional , Tuple
1212
1313import minizinc
1414
@@ -109,7 +109,7 @@ class Solver:
109109 _identifier : Optional [str ] = None
110110
111111 @classmethod
112- def lookup (cls , tag : str , driver = None ):
112+ def lookup (cls , tag : str , driver = None , refresh = False ):
113113 """Lookup a solver configuration in the driver registry.
114114
115115 Access the MiniZinc driver's known solver configuration and find the
@@ -121,6 +121,7 @@ def lookup(cls, tag: str, driver=None):
121121 tag (str): tag (or id) of a solver configuration to look up.
122122 driver (Driver): driver which registry will be searched for the
123123 solver. If set to None, then ``default_driver`` will be used.
124+ refresh (bool): Forces the driver to refresh the cache of available solvers.
124125
125126 Returns:
126127 Solver: MiniZinc solver configuration compatible with the driver.
@@ -131,41 +132,17 @@ def lookup(cls, tag: str, driver=None):
131132 """
132133 if driver is None :
133134 driver = minizinc .default_driver
134- from . CLI . driver import CLIDriver
135+ assert driver is not None
135136
136- assert isinstance (driver , CLIDriver )
137- if driver is not None :
138- output = driver .run (["--solvers-json" ])
139- else :
140- raise LookupError ("Solver is not linked to a MiniZinc driver" )
141- # Find all available solvers
142- solvers = json .loads (output .stdout )
137+ tag_map = driver .available_solvers (refresh )
143138
144- # Find the specified solver
145- lookup : Optional [Dict [str , Any ]] = None
146- names : Set [str ] = set ()
147- for s in solvers :
148- s_names = [s ["id" ], s ["id" ].split ("." )[- 1 ]]
149- s_names .extend (s .get ("tags" , []))
150- names = names .union (set (s_names ))
151- if tag in s_names :
152- lookup = s
153- break
154- if lookup is None :
139+ if tag not in tag_map or len (tag_map [tag ]) < 1 :
155140 raise LookupError (
156141 f"No solver id or tag '{ tag } ' found, available options: "
157- f"{ sorted ([ x for x in names ] )} "
142+ f"{ sorted (tag_map . keys () )} "
158143 )
159144
160- allowed_fields = set ([f .name for f in fields (cls )])
161- ret = cls (
162- ** {key : value for (key , value ) in lookup .items () if key in allowed_fields }
163- )
164- if ret .version == "<unknown version>" :
165- ret ._identifier = ret .id
166- else :
167- ret ._identifier = ret .id + "@" + ret .version
168- return ret
145+ return tag_map [tag ][0 ]
169146
170147 @classmethod
171148 def load (cls , path : Path ):
0 commit comments