You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

308 lines
10 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. # Bachelorarbeit Ergebnisse reproduzieren
  2. ~~~bash
  3. git clone --recursive http://sargas.org:3000/QA_SAT/BA_Reproduzierbarkeit_Anleitung.git
  4. ~~~
  5. ## Setup
  6. Zuerst muss ein virtual environment für Python eingerichtet werden. Gehen Sie hierfür in das Hauptverzeichnis des Projekts und führen Sie
  7. ~~~bash
  8. pipenv install
  9. ~~~
  10. aus. Anschließend muss noch ein kernel für jupyter erstellt werden, hierzu führen Sie
  11. ~~~bash
  12. python -m ipykernel install --user --name=BA_Reproduzierbarkeit_Anleitung
  13. ~~~
  14. aus. Anschließend kann das virtual environment mit
  15. ~~~bash
  16. pipenv shell
  17. ~~~
  18. aktiviert werden.
  19. ## Kompilieren
  20. Führen Sie folgende Anweisungen aus, um die notwendigen libraries und Tools zu kompilieren.
  21. ~~~bash
  22. ./qubo_lab/SconsLocal/scons.py -C ./qubo_lab/ --init
  23. ~~~
  24. ~~~bash
  25. ./qubo_lab/SconsLocal/scons.py -C ./qubo_lab/
  26. ~~~
  27. ## Datenbanken einrichten
  28. Es werden zwei Datenbanken benötigt, eine MySQL und eine MongoDB Datenbank. In der MongoDB Datenbank werden Objekte wie SAT-Instanzen, QUBOS oder D-Wave SampleSets gespeichert. Die MySQL Datenbank wird dazu verwendet, um Daten aus diesen Objekten zu extrahieren und diese anschließend zu untersuchen. Damit die Datenbanken genutzt werden können muss im Hauptverzeichnis ein File namens **database.config** angelegt werden, welches folgende Struktur aufzuweisen hat.
  29. ~~~ini
  30. [INSTANCE_POOL]
  31. user = ...
  32. pw = ...
  33. url = ...
  34. port = ...
  35. database = ...
  36. [EXPERIMENT_DB]
  37. user = ...
  38. pw = ...
  39. url = ...
  40. port = ...
  41. database = ...
  42. ~~~
  43. Bei **[INSTANCE_POOL]** handelt es sich um die MongoDB Datenbank und bei **[EXPERIMENT_DB]** um die MySQL Datenbank.
  44. ## Verbindung zum D-Wave Solver
  45. Der Zugriff auf einen D-Wave Solver setzt ein **dwave.config** file im Hauptverzeichnis voraus. Weitere Informationen hierzu finden Sie in der offiziellen [Dokumentation](https://docs.ocean.dwavesys.com/projects/cloud-client/en/latest/index.html) des D-Wave Cloud Clients :
  46. ## Datensatz generieren
  47. Ein k-SAT-Instanzen Datensatz mit einer fixer Klauselanzahl und logistisch verteilen Variablenanzahlen kann mit folgendem Python script erzeugt werden.
  48. ~~~python
  49. from qubo_lab.util import script
  50. from qubo_lab.util import random_instance_pool as rip
  51. instance_db = script.connect_to_instance_pool()
  52. experiment_db = script.connect_to_experimetns_db()
  53. script.create_experiment_scope(instance_db, "my description", "scope_name")
  54. logistic_variable_distr_params =
  55. {
  56. number_of_clauses: 42,
  57. min_variables: 5,
  58. max_variables: 84,
  59. alpha_point_of_interest: 4.2,
  60. steepness: 1.4
  61. }
  62. number_of_instances = 250
  63. instance_params = rip.Instance_parameters(42, 5, 3);
  64. pool = rip.create_random_logistic_pool(logistic_variable_distr_params, 250, instance_params)
  65. for instance in pool:
  66. instacne_id = script.write_instance_to_pool_db(instance_db, instance)
  67. script.add_instance_to_experiment_scope(instance_db, "scope_name", instacne_id)
  68. ~~~
  69. ## Daten über k-SAT-Instanzen extrahieren
  70. Für die spätere Analyse werden Daten über die k-SAT-Instanzen extrahiert und in einer Tabelle der MySQL Datenbank gespeichert.
  71. Legen Sie hierfür folgende Tabelle an.
  72. ~~~sql
  73. CREATE TABLE `instances` (
  74. `instance_id` char(24) NOT NULL DEFAULT '',
  75. `number_of_clauses` int(11) DEFAULT NULL,
  76. `number_of_variables` int(11) DEFAULT NULL,
  77. PRIMARY KEY (`instance_id`)
  78. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  79. ~~~
  80. Anschließend können Sie mit diesem Python code extrahiert werden.
  81. ~~~python
  82. from qubo_lab.util import script
  83. instance_db = script.connect_to_instance_pool()
  84. script.extract_instance_parameters()
  85. ~~~
  86. Sie werden nun nach einigen Dingen gefragt, folgende Tabelle erklärt die Bedeutungen der Abfragen:
  87. Abfrage| Erklärung
  88. ----------|---------------
  89. scope: | Name des Experiment-Scopes (**scope_name**)
  90. table name: | Name der gerade erstellten Tabelle ("instances")
  91. ## Minisat ausführen
  92. Als nächstes muss der Minisat Solver auf dem gerade generierten Datensatz gelaufen lassen werden.
  93. Hierzu führen Sie vom Hauptverzeichnis
  94. ~~~bash
  95. ./qubo_lab/build/release/runMinisat
  96. ~~~
  97. aus. Wenn Sie nach dem Datenbanken Konfigurationsfile gefragt werden, geben Sie das oben beschriebene **database.config** file an. Als "Experiment scope" geben Sie den **scope_name** aus dem Abschnitt *"Datensatz generieren"* an.
  98. Anschließend müssen die Ergebnisse des Minisat Solvers extrahiert werden. Hierfür muss eine Tabelle in der Experiment Datenbank angelegt werden:
  99. ~~~sql
  100. CREATE TABLE `minisat_runs` (
  101. `run_id` char(24) NOT NULL DEFAULT '',
  102. `instance_id` char(24) DEFAULT NULL,
  103. `satisfiable` tinyint(1) DEFAULT NULL,
  104. PRIMARY KEY (`run_id`)
  105. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  106. ~~~
  107. Ist diese Tabelle angelegt, können die Ergebnisse extrahiert werden, führen Sie hierzu folgenden Python code aus.
  108. ~~~python
  109. from qubo_lab.util import data_extraction
  110. data_extraction.extract_minisat_results()
  111. ~~~
  112. Sie werden nun nach einigen dingen gefragt, folgende Tabelle erklärt die Bedeutungen der Abfragen:
  113. Abfrage| Erklärung
  114. ----------|---------------
  115. scope: | Name des Experiment-Scopes (**scope_name**)
  116. table name: | Name der gerade erstellten Tabelle ("minisat_runs")
  117. ## SAT < WMIS Reduktion
  118. Zuerst müssen die QUBOs dieser Reduktion erstellt und in der MongoDB Datenbank abgespeichert werden, was durch folgenden Python code erledigt wird.
  119. ~~~python
  120. from qubo_lab.util import script
  121. instance_db = script.connect_to_instance_pool()
  122. script.create_wmis_qubos_for_scope(instance_db, "scope_name")
  123. ~~~
  124. Im nächsten Schritt müssen die erzeugten QUBOs auf dem Hardwaregraphen des D-Wave Solvers eingebettet werden.
  125. ~~~python
  126. from qubo_lab.util import script
  127. from qubo_lab.util import queries
  128. from qubo_lab.util import graph
  129. from dwave.system.samplers import DWaveSampler
  130. instance_db = script.connect_to_instance_pool()
  131. solver_graph = graph.create_qpu_solver_nxgraph(DWaveSampler().solver)
  132. qubos = queries.Qubo_scope_query(instance_db, "wmis_qubos")
  133. qubos.query("scope_name")
  134. script.find_embeddings_for_scope(instance_db, solver_graph, qubos)
  135. ~~~
  136. Führen Sie (**find_embeddings_for_scope(...)**) solange aus bis alle für alle QUBOs ein Embedding gefunden wurde. Sollte dies nicht möglich sein, sind die QUBOs zu groß für den Hardwaregraphen.
  137. Nun können die QUBOs dem D-Wave Solver übergeben werden. Führen Sie hierzu
  138. ~~~bash
  139. ./qubo_lab/run_sampler_on_scope.py
  140. ~~~
  141. aus. Folgende Tabelle erklärt wieder die Abfragen des Scripts:
  142. Abfrage | Erklärung
  143. --------- |--------------
  144. choose mode: | wählen Sie hier **qpu** um den D-Wave Solver auszuwählen
  145. ising/qubo collection: | die collection in der die QUBOs gespeichert sind ("wmis_qubos")
  146. scope: | der oben angelegte Experiment-Scope ("scope_name")
  147. annealing time (in us): | die Annealzeit des D-Wave Solvers pro Sample
  148. number of reads per instance: | die Anzahl der Sample pro Instanz
  149. qubo_negation: | wählen Sie hier **false** - die QUBOs müssen nicht negiert werden
  150. save as run (numbered): | die Nummer des Durchlaufs
  151. Nachdem der D-Wave Sovler alle Instanzen bearbeitet hat, muss zunächst wieder eine Tabelle erstellt werden,
  152. ~~~sql
  153. CREATE TABLE `wmis_qpu_results` (
  154. `result_id` char(24) NOT NULL DEFAULT '',
  155. `run` int(11) DEFAULT NULL,
  156. `instance_id` char(24) DEFAULT NULL,
  157. `number_of_found_assignments` int(11) DEFAULT NULL,
  158. `chain_break_fraction` float DEFAULT NULL,
  159. `num_occurrences` int(11) DEFAULT NULL,
  160. `energy` float DEFAULT NULL,
  161. `satisfiable` tinyint(1) DEFAULT NULL,
  162. `anneal_time` int(11) DEFAULT NULL,
  163. `energy_reach` int(11) DEFAULT NULL,
  164. `sample_size` int(11) DEFAULT NULL,
  165. PRIMARY KEY (`result_id`)
  166. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  167. ~~~
  168. um anschließend Daten aus den Ergebnissen des D-Wave Solvers zu extrahieren:
  169. ~~~python
  170. from qubo_lab.util import script
  171. instance_db = script.connect_to_instance_pool()
  172. script.extract_wmis_qpu_results()
  173. ~~~
  174. Abfrage| Erklärung
  175. ----------|---------------
  176. scope: | Name des Experiment-Scopes (**scope_name**)
  177. result collection: | "wmis_qubos"
  178. table name: | Name der gerade erstellten Tabelle ("wmis_qpu_results")
  179. ## Variablenhauptstrang Methode
  180. Zuerst müssen wieder die QUBOs der Variablenhauptstrang Methode erstellt werden.
  181. ~~~python
  182. from qubo_lab.util import script
  183. instance_db = script.connect_to_instance_pool()
  184. script.create_wmis_2_qubos_for_scope(instance_db, "scope_name")
  185. ~~~
  186. Anschließend müssen wieder die Embeddings gefunden werden.
  187. ~~~python
  188. from qubo_lab.util import script
  189. from qubo_lab.util import queries
  190. from qubo_lab.util import graph
  191. from dwave.system.samplers import DWaveSampler
  192. instance_db = script.connect_to_instance_pool()
  193. solver_graph = graph.create_qpu_solver_nxgraph(DWaveSampler().solver)
  194. qubos = queries.Ising_scope_query(instance_db, "wmis_2_qubos")
  195. qubos.query("scope_name")
  196. script.find_embeddings_for_scope(instance_db, solver_graph, qubos)
  197. ~~~
  198. Nun können Sie wieder den D-Wave Sampler über die Instanzen laufen lassen.
  199. ~~~bash
  200. ./qubo_lab/run_sampler_on_scope.py
  201. ~~~
  202. Achten Sie darauf bei der Abfrage der *"Ising/qubo collection"* diesmal "wmis_2_qubos" anzugeben.
  203. Nun erstellen Sie erneut eine Tabelle für die zu extrahierenden Daten.
  204. ~~~sql
  205. CREATE TABLE `wmis_2_qpu_results` (
  206. `result_id` char(24) NOT NULL DEFAULT '',
  207. `run` int(11) DEFAULT NULL,
  208. `instance_id` char(24) DEFAULT NULL,
  209. `number_of_found_assignments` int(11) DEFAULT NULL,
  210. `chain_break_fraction` float DEFAULT NULL,
  211. `num_occurrences` int(11) DEFAULT NULL,
  212. `energy` float DEFAULT NULL,
  213. `satisfiable` tinyint(1) DEFAULT NULL,
  214. `anneal_time` int(11) DEFAULT NULL,
  215. `energy_reach` int(11) DEFAULT NULL,
  216. `sample_size` int(11) DEFAULT NULL,
  217. PRIMARY KEY (`result_id`)
  218. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  219. ~~~
  220. Ist die Tabelle erstellt können die Daten extrahiert werden.
  221. ~~~python
  222. from qubo_lab.util import script
  223. instance_db = script.connect_to_instance_pool()
  224. script.extract_wmis_2_qpu_results()
  225. ~~~
  226. Abfrage| Erklärung
  227. ----------|---------------
  228. scope: | Name des Experiment-Scopes (**scope_name**)
  229. result collection: | "wmis_qubos"
  230. table name: | Name der gerade erstellten Tabelle ("wmis_2_qpu_results")
  231. ## Auswertung
  232. Die extrahierten Daten befinden sich nun in zur Auswertung geeigneter Form in der MySQL Datenbank. Für weitere Erläuterungen zur Auswertung wird auf die Bachelorarbeit verwiesen.