ciocore 7.0.2b4__py2.py3-none-any.whl → 8.0.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ciocore might be problematic. Click here for more details.

Files changed (112) hide show
  1. ciocore/VERSION +1 -1
  2. ciocore/__init__.py +23 -1
  3. ciocore/api_client.py +422 -156
  4. ciocore/cli.py +503 -0
  5. ciocore/common.py +10 -1
  6. ciocore/config.py +86 -54
  7. ciocore/data.py +23 -70
  8. ciocore/docsite/404.html +723 -0
  9. ciocore/docsite/apidoc/api_client/index.html +3203 -0
  10. ciocore/docsite/apidoc/apidoc/index.html +868 -0
  11. ciocore/docsite/apidoc/config/index.html +1591 -0
  12. ciocore/docsite/apidoc/data/index.html +1480 -0
  13. ciocore/docsite/apidoc/hardware_set/index.html +2367 -0
  14. ciocore/docsite/apidoc/package_environment/index.html +1450 -0
  15. ciocore/docsite/apidoc/package_tree/index.html +2310 -0
  16. ciocore/docsite/assets/_mkdocstrings.css +16 -0
  17. ciocore/docsite/assets/images/favicon.png +0 -0
  18. ciocore/docsite/assets/javascripts/bundle.4e31edb1.min.js +29 -0
  19. ciocore/docsite/assets/javascripts/bundle.4e31edb1.min.js.map +8 -0
  20. ciocore/docsite/assets/javascripts/lunr/min/lunr.ar.min.js +1 -0
  21. ciocore/docsite/assets/javascripts/lunr/min/lunr.da.min.js +18 -0
  22. ciocore/docsite/assets/javascripts/lunr/min/lunr.de.min.js +18 -0
  23. ciocore/docsite/assets/javascripts/lunr/min/lunr.du.min.js +18 -0
  24. ciocore/docsite/assets/javascripts/lunr/min/lunr.es.min.js +18 -0
  25. ciocore/docsite/assets/javascripts/lunr/min/lunr.fi.min.js +18 -0
  26. ciocore/docsite/assets/javascripts/lunr/min/lunr.fr.min.js +18 -0
  27. ciocore/docsite/assets/javascripts/lunr/min/lunr.hi.min.js +1 -0
  28. ciocore/docsite/assets/javascripts/lunr/min/lunr.hu.min.js +18 -0
  29. ciocore/docsite/assets/javascripts/lunr/min/lunr.hy.min.js +1 -0
  30. ciocore/docsite/assets/javascripts/lunr/min/lunr.it.min.js +18 -0
  31. ciocore/docsite/assets/javascripts/lunr/min/lunr.ja.min.js +1 -0
  32. ciocore/docsite/assets/javascripts/lunr/min/lunr.jp.min.js +1 -0
  33. ciocore/docsite/assets/javascripts/lunr/min/lunr.kn.min.js +1 -0
  34. ciocore/docsite/assets/javascripts/lunr/min/lunr.ko.min.js +1 -0
  35. ciocore/docsite/assets/javascripts/lunr/min/lunr.multi.min.js +1 -0
  36. ciocore/docsite/assets/javascripts/lunr/min/lunr.nl.min.js +18 -0
  37. ciocore/docsite/assets/javascripts/lunr/min/lunr.no.min.js +18 -0
  38. ciocore/docsite/assets/javascripts/lunr/min/lunr.pt.min.js +18 -0
  39. ciocore/docsite/assets/javascripts/lunr/min/lunr.ro.min.js +18 -0
  40. ciocore/docsite/assets/javascripts/lunr/min/lunr.ru.min.js +18 -0
  41. ciocore/docsite/assets/javascripts/lunr/min/lunr.sa.min.js +1 -0
  42. ciocore/docsite/assets/javascripts/lunr/min/lunr.stemmer.support.min.js +1 -0
  43. ciocore/docsite/assets/javascripts/lunr/min/lunr.sv.min.js +18 -0
  44. ciocore/docsite/assets/javascripts/lunr/min/lunr.ta.min.js +1 -0
  45. ciocore/docsite/assets/javascripts/lunr/min/lunr.te.min.js +1 -0
  46. ciocore/docsite/assets/javascripts/lunr/min/lunr.th.min.js +1 -0
  47. ciocore/docsite/assets/javascripts/lunr/min/lunr.tr.min.js +18 -0
  48. ciocore/docsite/assets/javascripts/lunr/min/lunr.vi.min.js +1 -0
  49. ciocore/docsite/assets/javascripts/lunr/min/lunr.zh.min.js +1 -0
  50. ciocore/docsite/assets/javascripts/lunr/tinyseg.js +206 -0
  51. ciocore/docsite/assets/javascripts/lunr/wordcut.js +6708 -0
  52. ciocore/docsite/assets/javascripts/workers/search.dfff1995.min.js +42 -0
  53. ciocore/docsite/assets/javascripts/workers/search.dfff1995.min.js.map +8 -0
  54. ciocore/docsite/assets/stylesheets/main.83068744.min.css +1 -0
  55. ciocore/docsite/assets/stylesheets/main.83068744.min.css.map +1 -0
  56. ciocore/docsite/assets/stylesheets/palette.ecc896b0.min.css +1 -0
  57. ciocore/docsite/assets/stylesheets/palette.ecc896b0.min.css.map +1 -0
  58. ciocore/docsite/cmdline/docs/index.html +834 -0
  59. ciocore/docsite/cmdline/downloader/index.html +897 -0
  60. ciocore/docsite/cmdline/packages/index.html +841 -0
  61. ciocore/docsite/cmdline/uploader/index.html +950 -0
  62. ciocore/docsite/how-to-guides/index.html +831 -0
  63. ciocore/docsite/index.html +853 -0
  64. ciocore/docsite/logo.png +0 -0
  65. ciocore/docsite/objects.inv +0 -0
  66. ciocore/docsite/search/search_index.json +1 -0
  67. ciocore/docsite/sitemap.xml +3 -0
  68. ciocore/docsite/sitemap.xml.gz +0 -0
  69. ciocore/docsite/stylesheets/extra.css +26 -0
  70. ciocore/docsite/stylesheets/tables.css +167 -0
  71. ciocore/downloader/__init__.py +0 -0
  72. ciocore/downloader/base_downloader.py +644 -0
  73. ciocore/downloader/download_runner_base.py +47 -0
  74. ciocore/downloader/job_downloader.py +119 -0
  75. ciocore/{downloader.py → downloader/legacy_downloader.py} +0 -1
  76. ciocore/downloader/log.py +73 -0
  77. ciocore/downloader/logging_download_runner.py +87 -0
  78. ciocore/downloader/perpetual_downloader.py +63 -0
  79. ciocore/downloader/registry.py +97 -0
  80. ciocore/downloader/reporter.py +135 -0
  81. ciocore/file_utils.py +3 -3
  82. ciocore/hardware_set.py +0 -4
  83. ciocore/package_environment.py +67 -75
  84. ciocore/package_query.py +171 -0
  85. ciocore/package_tree.py +300 -377
  86. ciocore/retry.py +0 -0
  87. ciocore/uploader/_uploader.py +205 -152
  88. {ciocore-7.0.2b4.dist-info → ciocore-8.0.0.dist-info}/METADATA +33 -12
  89. ciocore-8.0.0.dist-info/RECORD +127 -0
  90. {ciocore-7.0.2b4.dist-info → ciocore-8.0.0.dist-info}/WHEEL +1 -1
  91. ciocore-8.0.0.dist-info/entry_points.txt +2 -0
  92. tests/extra_env_fixtures.py +57 -0
  93. tests/instance_type_fixtures.py +42 -8
  94. tests/project_fixtures.py +8 -0
  95. tests/test_api_client.py +125 -4
  96. tests/test_base_downloader.py +104 -0
  97. tests/test_cli.py +163 -0
  98. tests/test_common.py +8 -8
  99. tests/test_config.py +23 -9
  100. tests/test_data.py +148 -160
  101. tests/test_downloader.py +118 -0
  102. tests/test_hardware_set.py +70 -20
  103. tests/test_job_downloader.py +213 -0
  104. tests/test_submit.py +9 -2
  105. ciocore/__about__.py +0 -10
  106. ciocore/cli/__init__.py +0 -3
  107. ciocore/cli/conductor.py +0 -210
  108. ciocore-7.0.2b4.data/scripts/conductor +0 -19
  109. ciocore-7.0.2b4.data/scripts/conductor.bat +0 -13
  110. ciocore-7.0.2b4.dist-info/RECORD +0 -51
  111. tests/mocks/api_client_mock.py +0 -31
  112. {ciocore-7.0.2b4.dist-info → ciocore-8.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,2367 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+
10
+ <meta name="author" content="Conductor Developers">
11
+
12
+
13
+
14
+ <link rel="prev" href="../data/">
15
+
16
+
17
+ <link rel="next" href="../package_tree/">
18
+
19
+
20
+ <link rel="icon" href="../../assets/images/favicon.png">
21
+ <meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.2.0-b2">
22
+
23
+
24
+
25
+ <title>ciocore.hardware_set - Conductor Core</title>
26
+
27
+
28
+
29
+ <link rel="stylesheet" href="../../assets/stylesheets/main.83068744.min.css">
30
+
31
+
32
+ <link rel="stylesheet" href="../../assets/stylesheets/palette.ecc896b0.min.css">
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
46
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Raleway:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
47
+ <style>:root{--md-text-font:"Raleway";--md-code-font:"Roboto Mono"}</style>
48
+
49
+
50
+
51
+ <link rel="stylesheet" href="../../assets/_mkdocstrings.css">
52
+
53
+ <link rel="stylesheet" href="../../stylesheets/extra.css">
54
+
55
+ <link rel="stylesheet" href="../../stylesheets/tables.css">
56
+
57
+ <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
58
+
59
+
60
+
61
+
62
+
63
+
64
+ </head>
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
75
+
76
+
77
+
78
+ <script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
79
+
80
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
81
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
82
+ <label class="md-overlay" for="__drawer"></label>
83
+ <div data-md-component="skip">
84
+
85
+
86
+ <a href="#ciocorehardware_set" class="md-skip">
87
+ Skip to content
88
+ </a>
89
+
90
+ </div>
91
+ <div data-md-component="announce">
92
+
93
+ </div>
94
+
95
+
96
+
97
+
98
+
99
+
100
+ <header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
101
+ <nav class="md-header__inner md-grid" aria-label="Header">
102
+ <a href="https://www.conductortech.com" title="Conductor Core" class="md-header__button md-logo" aria-label="Conductor Core" data-md-component="logo">
103
+
104
+ <img src="../../logo.png" alt="logo">
105
+
106
+ </a>
107
+ <label class="md-header__button md-icon" for="__drawer">
108
+
109
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
110
+ </label>
111
+ <div class="md-header__title" data-md-component="header-title">
112
+ <div class="md-header__ellipsis">
113
+ <div class="md-header__topic">
114
+ <span class="md-ellipsis">
115
+ Conductor Core
116
+ </span>
117
+ </div>
118
+ <div class="md-header__topic" data-md-component="header-topic">
119
+ <span class="md-ellipsis">
120
+
121
+ ciocore.hardware_set
122
+
123
+ </span>
124
+ </div>
125
+ </div>
126
+ </div>
127
+
128
+
129
+ <form class="md-header__option" data-md-component="palette">
130
+
131
+
132
+
133
+
134
+ <input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
135
+
136
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_2" hidden>
137
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
138
+ </label>
139
+
140
+
141
+
142
+
143
+
144
+ <input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_2">
145
+
146
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
147
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
148
+ </label>
149
+
150
+
151
+ </form>
152
+
153
+
154
+
155
+
156
+ <label class="md-header__button md-icon" for="__search">
157
+
158
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
159
+ </label>
160
+ <div class="md-search" data-md-component="search" role="dialog">
161
+ <label class="md-search__overlay" for="__search"></label>
162
+ <div class="md-search__inner" role="search">
163
+ <form class="md-search__form" name="search">
164
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
165
+ <label class="md-search__icon md-icon" for="__search">
166
+
167
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
168
+
169
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
170
+ </label>
171
+ <nav class="md-search__options" aria-label="Search">
172
+
173
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
174
+
175
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
176
+ </button>
177
+ </nav>
178
+
179
+ </form>
180
+ <div class="md-search__output">
181
+ <div class="md-search__scrollwrap" data-md-scrollfix>
182
+ <div class="md-search-result" data-md-component="search-result">
183
+ <div class="md-search-result__meta">
184
+ Initializing search
185
+ </div>
186
+ <ol class="md-search-result__list" role="presentation"></ol>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ </div>
191
+ </div>
192
+
193
+
194
+ </nav>
195
+
196
+
197
+
198
+ <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
199
+ <div class="md-grid">
200
+ <ul class="md-tabs__list">
201
+
202
+
203
+
204
+
205
+
206
+ <li class="md-tabs__item">
207
+ <a href="../.." class="md-tabs__link">
208
+
209
+
210
+
211
+
212
+ Overview
213
+
214
+ </a>
215
+ </li>
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+ <li class="md-tabs__item">
226
+ <a href="../../cmdline/uploader/" class="md-tabs__link">
227
+
228
+
229
+ CLI
230
+
231
+ </a>
232
+ </li>
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+ <li class="md-tabs__item md-tabs__item--active">
246
+ <a href="../apidoc/" class="md-tabs__link">
247
+
248
+
249
+ API
250
+
251
+ </a>
252
+ </li>
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+ <li class="md-tabs__item">
262
+ <a href="../../how-to-guides/" class="md-tabs__link">
263
+
264
+
265
+
266
+
267
+ How to
268
+
269
+ </a>
270
+ </li>
271
+
272
+
273
+
274
+ </ul>
275
+ </div>
276
+ </nav>
277
+
278
+
279
+ </header>
280
+
281
+ <div class="md-container" data-md-component="container">
282
+
283
+
284
+
285
+
286
+ <main class="md-main" data-md-component="main">
287
+ <div class="md-main__inner md-grid">
288
+
289
+
290
+
291
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
292
+ <div class="md-sidebar__scrollwrap">
293
+ <div class="md-sidebar__inner">
294
+
295
+
296
+
297
+
298
+
299
+
300
+ <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
301
+ <label class="md-nav__title" for="__drawer">
302
+ <a href="https://www.conductortech.com" title="Conductor Core" class="md-nav__button md-logo" aria-label="Conductor Core" data-md-component="logo">
303
+
304
+ <img src="../../logo.png" alt="logo">
305
+
306
+ </a>
307
+ Conductor Core
308
+ </label>
309
+
310
+ <ul class="md-nav__list" data-md-scrollfix>
311
+
312
+
313
+
314
+
315
+
316
+
317
+ <li class="md-nav__item">
318
+ <a href="../.." class="md-nav__link">
319
+
320
+
321
+ <span class="md-ellipsis">
322
+ Overview
323
+ </span>
324
+
325
+
326
+ </a>
327
+ </li>
328
+
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+ <li class="md-nav__item md-nav__item--nested">
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
348
+
349
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
350
+
351
+
352
+ <span class="md-ellipsis">
353
+ CLI
354
+ </span>
355
+
356
+
357
+ <span class="md-nav__icon md-icon"></span>
358
+ </label>
359
+
360
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
361
+ <label class="md-nav__title" for="__nav_2">
362
+ <span class="md-nav__icon md-icon"></span>
363
+ CLI
364
+ </label>
365
+ <ul class="md-nav__list" data-md-scrollfix>
366
+
367
+
368
+
369
+
370
+
371
+
372
+ <li class="md-nav__item">
373
+ <a href="../../cmdline/uploader/" class="md-nav__link">
374
+
375
+
376
+ <span class="md-ellipsis">
377
+ Uploader
378
+ </span>
379
+
380
+
381
+ </a>
382
+ </li>
383
+
384
+
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+ <li class="md-nav__item">
393
+ <a href="../../cmdline/downloader/" class="md-nav__link">
394
+
395
+
396
+ <span class="md-ellipsis">
397
+ Downloader
398
+ </span>
399
+
400
+
401
+ </a>
402
+ </li>
403
+
404
+
405
+
406
+
407
+
408
+
409
+
410
+
411
+
412
+ <li class="md-nav__item">
413
+ <a href="../../cmdline/packages/" class="md-nav__link">
414
+
415
+
416
+ <span class="md-ellipsis">
417
+ Packages
418
+ </span>
419
+
420
+
421
+ </a>
422
+ </li>
423
+
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+
432
+ <li class="md-nav__item">
433
+ <a href="../../cmdline/docs/" class="md-nav__link">
434
+
435
+
436
+ <span class="md-ellipsis">
437
+ Docs
438
+ </span>
439
+
440
+
441
+ </a>
442
+ </li>
443
+
444
+
445
+
446
+
447
+ </ul>
448
+ </nav>
449
+
450
+ </li>
451
+
452
+
453
+
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+
464
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
465
+
466
+
467
+
468
+
469
+
470
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
471
+
472
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
473
+
474
+
475
+ <span class="md-ellipsis">
476
+ API
477
+ </span>
478
+
479
+
480
+ <span class="md-nav__icon md-icon"></span>
481
+ </label>
482
+
483
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
484
+ <label class="md-nav__title" for="__nav_3">
485
+ <span class="md-nav__icon md-icon"></span>
486
+ API
487
+ </label>
488
+ <ul class="md-nav__list" data-md-scrollfix>
489
+
490
+
491
+
492
+
493
+
494
+
495
+ <li class="md-nav__item">
496
+ <a href="../apidoc/" class="md-nav__link">
497
+
498
+
499
+ <span class="md-ellipsis">
500
+ Api Overview
501
+ </span>
502
+
503
+
504
+ </a>
505
+ </li>
506
+
507
+
508
+
509
+
510
+
511
+
512
+
513
+
514
+
515
+ <li class="md-nav__item">
516
+ <a href="../api_client/" class="md-nav__link">
517
+
518
+
519
+ <span class="md-ellipsis">
520
+ ciocore.api_client
521
+ </span>
522
+
523
+
524
+ </a>
525
+ </li>
526
+
527
+
528
+
529
+
530
+
531
+
532
+
533
+
534
+
535
+ <li class="md-nav__item">
536
+ <a href="../config/" class="md-nav__link">
537
+
538
+
539
+ <span class="md-ellipsis">
540
+ ciocore.config
541
+ </span>
542
+
543
+
544
+ </a>
545
+ </li>
546
+
547
+
548
+
549
+
550
+
551
+
552
+
553
+
554
+
555
+ <li class="md-nav__item">
556
+ <a href="../data/" class="md-nav__link">
557
+
558
+
559
+ <span class="md-ellipsis">
560
+ ciocore.data
561
+ </span>
562
+
563
+
564
+ </a>
565
+ </li>
566
+
567
+
568
+
569
+
570
+
571
+
572
+
573
+
574
+
575
+
576
+
577
+ <li class="md-nav__item md-nav__item--active">
578
+
579
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
580
+
581
+
582
+
583
+
584
+
585
+ <label class="md-nav__link md-nav__link--active" for="__toc">
586
+
587
+
588
+ <span class="md-ellipsis">
589
+ ciocore.hardware_set
590
+ </span>
591
+
592
+
593
+ <span class="md-nav__icon md-icon"></span>
594
+ </label>
595
+
596
+ <a href="./" class="md-nav__link md-nav__link--active">
597
+
598
+
599
+ <span class="md-ellipsis">
600
+ ciocore.hardware_set
601
+ </span>
602
+
603
+
604
+ </a>
605
+
606
+
607
+
608
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
609
+
610
+
611
+
612
+
613
+
614
+
615
+ <label class="md-nav__title" for="__toc">
616
+ <span class="md-nav__icon md-icon"></span>
617
+ Table of contents
618
+ </label>
619
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
620
+
621
+ <li class="md-nav__item">
622
+ <a href="#ciocore.hardware_set" class="md-nav__link">
623
+ ciocore.hardware_set
624
+ </a>
625
+
626
+ </li>
627
+
628
+ <li class="md-nav__item">
629
+ <a href="#ciocore.hardware_set.HardwareSet" class="md-nav__link">
630
+ HardwareSet
631
+ </a>
632
+
633
+ <nav class="md-nav" aria-label="HardwareSet">
634
+ <ul class="md-nav__list">
635
+
636
+ <li class="md-nav__item">
637
+ <a href="#ciocore.hardware_set.HardwareSet.__init__" class="md-nav__link">
638
+ __init__()
639
+ </a>
640
+
641
+ <nav class="md-nav" aria-label="__init__()">
642
+ <ul class="md-nav__list">
643
+
644
+ <li class="md-nav__item">
645
+ <a href="#ciocore.hardware_set.HardwareSet.__init__--initialize-with-a-list-of-instance-types" class="md-nav__link">
646
+ Initialize with a list of instance types
647
+ </a>
648
+
649
+ </li>
650
+
651
+ <li class="md-nav__item">
652
+ <a href="#ciocore.hardware_set.HardwareSet.__init__--initialize-implicitly-with-a-list-of-instance-types-from-ciocoredata-recommended" class="md-nav__link">
653
+ Initialize implicitly with a list of instance types from ciocore.data (recommended).
654
+ </a>
655
+
656
+ </li>
657
+
658
+ </ul>
659
+ </nav>
660
+
661
+ </li>
662
+
663
+ <li class="md-nav__item">
664
+ <a href="#ciocore.hardware_set.HardwareSet.labels" class="md-nav__link">
665
+ labels()
666
+ </a>
667
+
668
+ </li>
669
+
670
+ <li class="md-nav__item">
671
+ <a href="#ciocore.hardware_set.HardwareSet.number_of_categories" class="md-nav__link">
672
+ number_of_categories()
673
+ </a>
674
+
675
+ </li>
676
+
677
+ <li class="md-nav__item">
678
+ <a href="#ciocore.hardware_set.HardwareSet.recategorize" class="md-nav__link">
679
+ recategorize()
680
+ </a>
681
+
682
+ <nav class="md-nav" aria-label="recategorize()">
683
+ <ul class="md-nav__list">
684
+
685
+ <li class="md-nav__item">
686
+ <a href="#ciocore.hardware_set.HardwareSet.recategorize--confirm-current-categories" class="md-nav__link">
687
+ Confirm current categories
688
+ </a>
689
+
690
+ </li>
691
+
692
+ <li class="md-nav__item">
693
+ <a href="#ciocore.hardware_set.HardwareSet.recategorize--recategorize" class="md-nav__link">
694
+ Recategorize
695
+ </a>
696
+
697
+ </li>
698
+
699
+ </ul>
700
+ </nav>
701
+
702
+ </li>
703
+
704
+ <li class="md-nav__item">
705
+ <a href="#ciocore.hardware_set.HardwareSet.find" class="md-nav__link">
706
+ find()
707
+ </a>
708
+
709
+ </li>
710
+
711
+ <li class="md-nav__item">
712
+ <a href="#ciocore.hardware_set.HardwareSet.find_category" class="md-nav__link">
713
+ find_category()
714
+ </a>
715
+
716
+ </li>
717
+
718
+ <li class="md-nav__item">
719
+ <a href="#ciocore.hardware_set.HardwareSet.find_all" class="md-nav__link">
720
+ find_all()
721
+ </a>
722
+
723
+ </li>
724
+
725
+ <li class="md-nav__item">
726
+ <a href="#ciocore.hardware_set.HardwareSet.find_first" class="md-nav__link">
727
+ find_first()
728
+ </a>
729
+
730
+ </li>
731
+
732
+ <li class="md-nav__item">
733
+ <a href="#ciocore.hardware_set.HardwareSet.get_model" class="md-nav__link">
734
+ get_model()
735
+ </a>
736
+
737
+ </li>
738
+
739
+ </ul>
740
+ </nav>
741
+
742
+ </li>
743
+
744
+ </ul>
745
+
746
+ </nav>
747
+
748
+ </li>
749
+
750
+
751
+
752
+
753
+
754
+
755
+
756
+
757
+
758
+ <li class="md-nav__item">
759
+ <a href="../package_tree/" class="md-nav__link">
760
+
761
+
762
+ <span class="md-ellipsis">
763
+ ciocore.package_tree
764
+ </span>
765
+
766
+
767
+ </a>
768
+ </li>
769
+
770
+
771
+
772
+
773
+
774
+
775
+
776
+
777
+
778
+ <li class="md-nav__item">
779
+ <a href="../package_environment/" class="md-nav__link">
780
+
781
+
782
+ <span class="md-ellipsis">
783
+ ciocore.package_environment
784
+ </span>
785
+
786
+
787
+ </a>
788
+ </li>
789
+
790
+
791
+
792
+
793
+ </ul>
794
+ </nav>
795
+
796
+ </li>
797
+
798
+
799
+
800
+
801
+
802
+
803
+
804
+
805
+ <li class="md-nav__item">
806
+ <a href="../../how-to-guides/" class="md-nav__link">
807
+
808
+
809
+ <span class="md-ellipsis">
810
+ How to
811
+ </span>
812
+
813
+
814
+ </a>
815
+ </li>
816
+
817
+
818
+
819
+ </ul>
820
+ </nav>
821
+ </div>
822
+ </div>
823
+ </div>
824
+
825
+
826
+
827
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
828
+ <div class="md-sidebar__scrollwrap">
829
+ <div class="md-sidebar__inner">
830
+
831
+
832
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
833
+
834
+
835
+
836
+
837
+
838
+
839
+ <label class="md-nav__title" for="__toc">
840
+ <span class="md-nav__icon md-icon"></span>
841
+ Table of contents
842
+ </label>
843
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
844
+
845
+ <li class="md-nav__item">
846
+ <a href="#ciocore.hardware_set" class="md-nav__link">
847
+ ciocore.hardware_set
848
+ </a>
849
+
850
+ </li>
851
+
852
+ <li class="md-nav__item">
853
+ <a href="#ciocore.hardware_set.HardwareSet" class="md-nav__link">
854
+ HardwareSet
855
+ </a>
856
+
857
+ <nav class="md-nav" aria-label="HardwareSet">
858
+ <ul class="md-nav__list">
859
+
860
+ <li class="md-nav__item">
861
+ <a href="#ciocore.hardware_set.HardwareSet.__init__" class="md-nav__link">
862
+ __init__()
863
+ </a>
864
+
865
+ <nav class="md-nav" aria-label="__init__()">
866
+ <ul class="md-nav__list">
867
+
868
+ <li class="md-nav__item">
869
+ <a href="#ciocore.hardware_set.HardwareSet.__init__--initialize-with-a-list-of-instance-types" class="md-nav__link">
870
+ Initialize with a list of instance types
871
+ </a>
872
+
873
+ </li>
874
+
875
+ <li class="md-nav__item">
876
+ <a href="#ciocore.hardware_set.HardwareSet.__init__--initialize-implicitly-with-a-list-of-instance-types-from-ciocoredata-recommended" class="md-nav__link">
877
+ Initialize implicitly with a list of instance types from ciocore.data (recommended).
878
+ </a>
879
+
880
+ </li>
881
+
882
+ </ul>
883
+ </nav>
884
+
885
+ </li>
886
+
887
+ <li class="md-nav__item">
888
+ <a href="#ciocore.hardware_set.HardwareSet.labels" class="md-nav__link">
889
+ labels()
890
+ </a>
891
+
892
+ </li>
893
+
894
+ <li class="md-nav__item">
895
+ <a href="#ciocore.hardware_set.HardwareSet.number_of_categories" class="md-nav__link">
896
+ number_of_categories()
897
+ </a>
898
+
899
+ </li>
900
+
901
+ <li class="md-nav__item">
902
+ <a href="#ciocore.hardware_set.HardwareSet.recategorize" class="md-nav__link">
903
+ recategorize()
904
+ </a>
905
+
906
+ <nav class="md-nav" aria-label="recategorize()">
907
+ <ul class="md-nav__list">
908
+
909
+ <li class="md-nav__item">
910
+ <a href="#ciocore.hardware_set.HardwareSet.recategorize--confirm-current-categories" class="md-nav__link">
911
+ Confirm current categories
912
+ </a>
913
+
914
+ </li>
915
+
916
+ <li class="md-nav__item">
917
+ <a href="#ciocore.hardware_set.HardwareSet.recategorize--recategorize" class="md-nav__link">
918
+ Recategorize
919
+ </a>
920
+
921
+ </li>
922
+
923
+ </ul>
924
+ </nav>
925
+
926
+ </li>
927
+
928
+ <li class="md-nav__item">
929
+ <a href="#ciocore.hardware_set.HardwareSet.find" class="md-nav__link">
930
+ find()
931
+ </a>
932
+
933
+ </li>
934
+
935
+ <li class="md-nav__item">
936
+ <a href="#ciocore.hardware_set.HardwareSet.find_category" class="md-nav__link">
937
+ find_category()
938
+ </a>
939
+
940
+ </li>
941
+
942
+ <li class="md-nav__item">
943
+ <a href="#ciocore.hardware_set.HardwareSet.find_all" class="md-nav__link">
944
+ find_all()
945
+ </a>
946
+
947
+ </li>
948
+
949
+ <li class="md-nav__item">
950
+ <a href="#ciocore.hardware_set.HardwareSet.find_first" class="md-nav__link">
951
+ find_first()
952
+ </a>
953
+
954
+ </li>
955
+
956
+ <li class="md-nav__item">
957
+ <a href="#ciocore.hardware_set.HardwareSet.get_model" class="md-nav__link">
958
+ get_model()
959
+ </a>
960
+
961
+ </li>
962
+
963
+ </ul>
964
+ </nav>
965
+
966
+ </li>
967
+
968
+ </ul>
969
+
970
+ </nav>
971
+ </div>
972
+ </div>
973
+ </div>
974
+
975
+
976
+
977
+ <div class="md-content" data-md-component="content">
978
+ <article class="md-content__inner md-typeset">
979
+
980
+
981
+
982
+
983
+ <h1 id="ciocorehardware_set">ciocore.hardware_set</h1>
984
+
985
+
986
+ <div class="doc doc-object doc-module">
987
+
988
+ <a id="ciocore.hardware_set"></a>
989
+ <div class="doc doc-contents first">
990
+
991
+ <p>This module contains the <strong>HardwareSet</strong> class. </p>
992
+ <p>It is designed to allow submission tools and other clients that consume instance types to be able to display them in categories. This is particularly useful for UIs that utilize combo-boxes, since they can be orgnaized into a nested structure and displayed in a tree-like fashion.</p>
993
+
994
+
995
+
996
+ <div class="doc doc-children">
997
+
998
+
999
+
1000
+
1001
+
1002
+
1003
+
1004
+
1005
+
1006
+
1007
+ <div class="doc doc-object doc-class">
1008
+
1009
+
1010
+
1011
+ <h2 id="ciocore.hardware_set.HardwareSet" class="doc doc-heading">
1012
+ <code>
1013
+ HardwareSet </code>
1014
+
1015
+
1016
+
1017
+ </h2>
1018
+
1019
+ <div class="doc doc-contents ">
1020
+
1021
+ <p>A class to manage categorized instance types.</p>
1022
+ <p>A HardwareSet encapsulates the instance types available to an account. It accepts a flat list of instance types and builds a nested structure where those instance types exist in categories.</p>
1023
+ <p>It keeps a dictionary of instance types (<code>instance_types</code>) with the name field as key. This allows easy lookup by name.</p>
1024
+ <p>In addition, it keeps the nested structure of categories (<code>categories</code>) that contain the instance types. Each category is a dictionary with keys: <code>label</code>, <code>content</code>, and <code>order</code>.</p>
1025
+ <p><code>content</code> is a list of instance types in the category. The order is used to sort the categories. The order of the instance types within a category is determined by the number of cores and memory.</p>
1026
+ <p>If all instance_types have not been assigned any categories, then the structure is built with two default categories: CPU and GPU.</p>
1027
+
1028
+ <details class="quote">
1029
+ <summary>Source code in <code>ciocore/hardware_set.py</code></summary>
1030
+ <div class="highlight"><pre><span></span><code><span class="k">class</span> <span class="nc">HardwareSet</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
1031
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;A class to manage categorized instance types.</span>
1032
+
1033
+ <span class="sd"> A HardwareSet encapsulates the instance types available to an account. It accepts a flat list of instance types and builds a nested structure where those instance types exist in categories.</span>
1034
+
1035
+ <span class="sd"> It keeps a dictionary of instance types (`instance_types`) with the name field as key. This allows easy lookup by name.</span>
1036
+
1037
+ <span class="sd"> In addition, it keeps the nested structure of categories (`categories`) that contain the instance types. Each category is a dictionary with keys: `label`, `content`, and `order`.</span>
1038
+
1039
+ <span class="sd"> `content` is a list of instance types in the category. The order is used to sort the categories. The order of the instance types within a category is determined by the number of cores and memory.</span>
1040
+
1041
+ <span class="sd"> If all instance_types have not been assigned any categories, then the structure is built with two default categories: CPU and GPU.</span>
1042
+ <span class="sd"> &quot;&quot;&quot;</span>
1043
+
1044
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance_types</span><span class="p">):</span>
1045
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Initialize the HardwareSet with a list of instance types.</span>
1046
+ <span class="sd"> Typically, you would access the HardwareSet through the ciocore.data.data() function, which initializes it for you. However, you can also initialize it directly with a list of instance types straight from ciocore.api_client. The difference being that the latter contains all instance types, whereas the former contains only the instance types compatible with the products you have specified, as well as being cached.</span>
1047
+
1048
+ <span class="sd"> Args:</span>
1049
+ <span class="sd"> instance_types (list): A list of instance types.</span>
1050
+
1051
+ <span class="sd"> Returns:</span>
1052
+ <span class="sd"> HardwareSet: The initialized HardwareSet.</span>
1053
+
1054
+ <span class="sd"> Examples:</span>
1055
+ <span class="sd"> ### Initialize with a list of instance types</span>
1056
+ <span class="sd"> &gt;&gt;&gt; from ciocore import api_client</span>
1057
+ <span class="sd"> &gt;&gt;&gt; from ciocore.hardware_set import HardwareSet</span>
1058
+ <span class="sd"> &gt;&gt;&gt; instance_types = api_client.request_instance_types()</span>
1059
+ <span class="sd"> &gt;&gt;&gt; hardware_set = HardwareSet(instance_types)</span>
1060
+ <span class="sd"> &lt;ciocore.hardware_set.HardwareSet object at 0x104c43d30&gt;</span>
1061
+
1062
+ <span class="sd"> ### Initialize implicitly with a list of instance types from ciocore.data (recommended).</span>
1063
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1064
+ <span class="sd"> &gt;&gt;&gt; coredata.init(&quot;cinema4d&quot;)</span>
1065
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1066
+ <span class="sd"> &lt;ciocore.hardware_set.HardwareSet object at 0x104c43ee0&gt;</span>
1067
+
1068
+ <span class="sd"> !!! note</span>
1069
+ <span class="sd"> To avoid repetition, we use the implicit initialization for the examples below.</span>
1070
+ <span class="sd"> &quot;&quot;&quot;</span>
1071
+
1072
+ <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_unique</span><span class="p">(</span><span class="n">instance_types</span><span class="p">)</span>
1073
+ <span class="bp">self</span><span class="o">.</span><span class="n">categories</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_categories</span><span class="p">()</span>
1074
+ <span class="bp">self</span><span class="o">.</span><span class="n">provider</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_provider</span><span class="p">()</span>
1075
+
1076
+ <span class="k">def</span> <span class="nf">labels</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1077
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the list of category labels.</span>
1078
+
1079
+ <span class="sd"> Returns:</span>
1080
+ <span class="sd"> list: A list of category labels.</span>
1081
+
1082
+ <span class="sd"> Example:</span>
1083
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1084
+ <span class="sd"> &gt;&gt;&gt; coredata.init()</span>
1085
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1086
+ <span class="sd"> &gt;&gt;&gt; hardware_set.labels()</span>
1087
+ <span class="sd"> [&#39;CPU&#39;, &#39;GPU&#39;]</span>
1088
+
1089
+ <span class="sd"> &quot;&quot;&quot;</span>
1090
+ <span class="k">return</span> <span class="p">[</span><span class="n">c</span><span class="p">[</span><span class="s2">&quot;label&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">categories</span><span class="p">]</span>
1091
+
1092
+ <span class="k">def</span> <span class="nf">number_of_categories</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1093
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the number of categories in the data.</span>
1094
+
1095
+ <span class="sd"> Returns:</span>
1096
+ <span class="sd"> int: The number of categories.</span>
1097
+
1098
+ <span class="sd"> Example:</span>
1099
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1100
+ <span class="sd"> &gt;&gt;&gt; coredata.init()</span>
1101
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1102
+ <span class="sd"> &gt;&gt;&gt; hardware_set.number_of_categories()</span>
1103
+ <span class="sd"> 2</span>
1104
+
1105
+ <span class="sd"> &quot;&quot;&quot;</span>
1106
+ <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">categories</span><span class="p">)</span>
1107
+
1108
+ <span class="k">def</span> <span class="nf">recategorize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partitioner</span><span class="p">):</span>
1109
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Recategorize the instance types.</span>
1110
+
1111
+ <span class="sd"> Args:</span>
1112
+ <span class="sd"> partitioner (function): A function that takes an instance type and returns a list of categories to assign to it. The function should return an empty list if the instance type should not be categorized.</span>
1113
+
1114
+ <span class="sd"> Example:</span>
1115
+ <span class="sd"> # Confirm current categories</span>
1116
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1117
+ <span class="sd"> &gt;&gt;&gt; coredata.init()</span>
1118
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1119
+ <span class="sd"> &gt;&gt;&gt; print(hardware_set.labels()</span>
1120
+ <span class="sd"> [&#39;CPU&#39;, &#39;GPU&#39;]</span>
1121
+
1122
+ <span class="sd"> # Recategorize</span>
1123
+ <span class="sd"> &gt;&gt;&gt; hardware_set.recategorize(lambda x: [{&#39;label&#39;: &#39;Low cores&#39;, &#39;order&#39;: 10}] if x[&quot;cores&quot;] &lt; 16 else [{&#39;label&#39;: &#39;High cores&#39;, &#39;order&#39;: 20}])</span>
1124
+ <span class="sd"> &gt;&gt;&gt; print(hardware_set.labels()</span>
1125
+ <span class="sd"> [&#39;Low cores&#39;, &#39;High cores&#39;]</span>
1126
+ <span class="sd"> &quot;&quot;&quot;</span>
1127
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">:</span>
1128
+ <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="s2">&quot;categories&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">partitioner</span><span class="p">(</span>
1129
+ <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
1130
+ <span class="p">)</span>
1131
+ <span class="bp">self</span><span class="o">.</span><span class="n">categories</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_categories</span><span class="p">()</span>
1132
+
1133
+ <span class="k">def</span> <span class="nf">find</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
1134
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Find an instance type by its name (sku).</span>
1135
+
1136
+ <span class="sd"> Args:</span>
1137
+ <span class="sd"> name (str): The name of the instance type.</span>
1138
+
1139
+ <span class="sd"> Returns:</span>
1140
+ <span class="sd"> dict: The instance type or None if not found.</span>
1141
+ <span class="sd"> Example:</span>
1142
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1143
+ <span class="sd"> &gt;&gt;&gt; coredata.init()</span>
1144
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1145
+ <span class="sd"> &gt;&gt;&gt; hardware_set.find(&quot;n2-highmem-80&quot;)</span>
1146
+ <span class="sd"> {</span>
1147
+ <span class="sd"> &#39;cores&#39;: 80,</span>
1148
+ <span class="sd"> &#39;description&#39;: &#39;80 core, 640GB Mem&#39;,</span>
1149
+ <span class="sd"> &#39;gpu&#39;: None,</span>
1150
+ <span class="sd"> &#39;memory&#39;: &#39;640&#39;,</span>
1151
+ <span class="sd"> &#39;name&#39;: &#39;n2-highmem-80&#39;,</span>
1152
+ <span class="sd"> &#39;operating_system&#39;: &#39;linux&#39;,</span>
1153
+ <span class="sd"> &#39;categories&#39;: [</span>
1154
+ <span class="sd"> {&#39;label&#39;: &#39;High cores&#39;, &#39;order&#39;: 20}</span>
1155
+ <span class="sd"> ]</span>
1156
+ <span class="sd"> }</span>
1157
+
1158
+ <span class="sd"> &quot;&quot;&quot;</span>
1159
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">category</span><span class="p">:</span>
1160
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
1161
+
1162
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">find_first</span><span class="p">(</span>
1163
+ <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="n">name</span>
1164
+ <span class="ow">and</span> <span class="n">category</span> <span class="ow">in</span> <span class="p">[</span><span class="n">c</span><span class="p">[</span><span class="s2">&quot;label&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">x</span><span class="p">[</span><span class="s2">&quot;categories&quot;</span><span class="p">]]</span>
1165
+ <span class="p">)</span>
1166
+
1167
+ <span class="k">def</span> <span class="nf">find_category</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">label</span><span class="p">):</span>
1168
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Find a category by label.</span>
1169
+
1170
+ <span class="sd"> Args:</span>
1171
+ <span class="sd"> label (str): The label of the category.</span>
1172
+
1173
+ <span class="sd"> Returns:</span>
1174
+ <span class="sd"> dict: The category or None if not found.</span>
1175
+ <span class="sd"> Example:</span>
1176
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1177
+ <span class="sd"> &gt;&gt;&gt; coredata.init()</span>
1178
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1179
+ <span class="sd"> &gt;&gt;&gt; hardware_set.find_category(&quot;High cores&quot;)</span>
1180
+ <span class="sd"> {</span>
1181
+ <span class="sd"> &quot;label&quot;: &quot;Low cores&quot;,</span>
1182
+ <span class="sd"> &quot;content&quot;: [</span>
1183
+ <span class="sd"> {</span>
1184
+ <span class="sd"> &quot;cores&quot;: 8,</span>
1185
+ <span class="sd"> &quot;description&quot;: &quot;8 core, 52GB Mem&quot;,</span>
1186
+ <span class="sd"> &quot;gpu&quot;: None,</span>
1187
+ <span class="sd"> &quot;memory&quot;: &quot;52&quot;,</span>
1188
+ <span class="sd"> &quot;name&quot;: &quot;n1-highmem-8&quot;,</span>
1189
+ <span class="sd"> &quot;operating_system&quot;: &quot;linux&quot;,</span>
1190
+ <span class="sd"> &quot;categories&quot;: [{&quot;label&quot;: &quot;Low cores&quot;, &quot;order&quot;: 10}],</span>
1191
+ <span class="sd"> },</span>
1192
+ <span class="sd"> {</span>
1193
+ <span class="sd"> &quot;cores&quot;: 8,</span>
1194
+ <span class="sd"> &quot;description&quot;: &quot;8 core, 7.2GB Mem&quot;,</span>
1195
+ <span class="sd"> &quot;gpu&quot;: None,</span>
1196
+ <span class="sd"> &quot;memory&quot;: &quot;7.2&quot;,</span>
1197
+ <span class="sd"> &quot;name&quot;: &quot;n1-highcpu-8&quot;,</span>
1198
+ <span class="sd"> &quot;operating_system&quot;: &quot;linux&quot;,</span>
1199
+ <span class="sd"> &quot;categories&quot;: [{&quot;label&quot;: &quot;Low cores&quot;, &quot;order&quot;: 10}],</span>
1200
+ <span class="sd"> },</span>
1201
+ <span class="sd"> ...</span>
1202
+ <span class="sd"> ],</span>
1203
+ <span class="sd"> &quot;order&quot;: 10</span>
1204
+ <span class="sd"> }</span>
1205
+ <span class="sd"> &quot;&quot;&quot;</span>
1206
+ <span class="k">return</span> <span class="nb">next</span><span class="p">((</span><span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">categories</span> <span class="k">if</span> <span class="n">c</span><span class="p">[</span><span class="s2">&quot;label&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="n">label</span><span class="p">),</span> <span class="kc">None</span><span class="p">)</span>
1207
+
1208
+ <span class="k">def</span> <span class="nf">find_all</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="p">):</span>
1209
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Find all instance types that match a condition.</span>
1210
+
1211
+ <span class="sd"> Args:</span>
1212
+ <span class="sd"> condition (function): A function that takes an instance type and returns True or False.</span>
1213
+
1214
+ <span class="sd"> Returns:</span>
1215
+ <span class="sd"> list: A list of instance types that match the condition.</span>
1216
+
1217
+ <span class="sd"> Example:</span>
1218
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1219
+ <span class="sd"> &gt;&gt;&gt; coredata.init()</span>
1220
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1221
+ <span class="sd"> &gt;&gt;&gt; hardware_set.find_all(lambda x: x[&quot;gpu&quot;])</span>
1222
+ <span class="sd"> [</span>
1223
+ <span class="sd"> {</span>
1224
+ <span class="sd"> &quot;cores&quot;: 4,</span>
1225
+ <span class="sd"> &quot;description&quot;: &quot;4 core, 15GB Mem (1 T4 Tensor GPU with 16GB Mem)&quot;,</span>
1226
+ <span class="sd"> &quot;gpu&quot;: {</span>
1227
+ <span class="sd"> &quot;gpu_architecture&quot;: &quot;NVIDIA Turing&quot;,</span>
1228
+ <span class="sd"> &quot;gpu_count&quot;: 1,</span>
1229
+ <span class="sd"> &quot;gpu_cuda_cores&quot;: 2560,</span>
1230
+ <span class="sd"> &quot;gpu_memory&quot;: &quot;16&quot;,</span>
1231
+ <span class="sd"> &quot;gpu_model&quot;: &quot;T4 Tensor&quot;,</span>
1232
+ <span class="sd"> &quot;gpu_rt_cores&quot;: 0,</span>
1233
+ <span class="sd"> &quot;gpu_tensor_cores&quot;: 0,</span>
1234
+ <span class="sd"> &quot;total_gpu_cuda_cores&quot;: 2560,</span>
1235
+ <span class="sd"> &quot;total_gpu_memory&quot;: &quot;16&quot;,</span>
1236
+ <span class="sd"> &quot;total_gpu_rt_cores&quot;: 0,</span>
1237
+ <span class="sd"> &quot;total_gpu_tensor_cores&quot;: 0,</span>
1238
+ <span class="sd"> },</span>
1239
+ <span class="sd"> &quot;memory&quot;: &quot;15&quot;,</span>
1240
+ <span class="sd"> &quot;name&quot;: &quot;n1-standard-4-t4-1&quot;,</span>
1241
+ <span class="sd"> &quot;operating_system&quot;: &quot;linux&quot;,</span>
1242
+ <span class="sd"> &quot;categories&quot;: [{&quot;label&quot;: &quot;Low cores&quot;, &quot;order&quot;: 10}],</span>
1243
+ <span class="sd"> },</span>
1244
+ <span class="sd"> {</span>
1245
+ <span class="sd"> &quot;cores&quot;: 8,</span>
1246
+ <span class="sd"> &quot;description&quot;: &quot;8 core, 30GB Mem (1 T4 Tensor GPU with 16GB Mem)&quot;,</span>
1247
+ <span class="sd"> &quot;gpu&quot;: {</span>
1248
+ <span class="sd"> &quot;gpu_architecture&quot;: &quot;NVIDIA Turing&quot;,</span>
1249
+ <span class="sd"> &quot;gpu_count&quot;: 1,</span>
1250
+ <span class="sd"> &quot;gpu_cuda_cores&quot;: 2560,</span>
1251
+ <span class="sd"> &quot;gpu_memory&quot;: &quot;16&quot;,</span>
1252
+ <span class="sd"> &quot;gpu_model&quot;: &quot;T4 Tensor&quot;,</span>
1253
+ <span class="sd"> &quot;gpu_rt_cores&quot;: 0,</span>
1254
+ <span class="sd"> &quot;gpu_tensor_cores&quot;: 0,</span>
1255
+ <span class="sd"> &quot;total_gpu_cuda_cores&quot;: 2560,</span>
1256
+ <span class="sd"> &quot;total_gpu_memory&quot;: &quot;16&quot;,</span>
1257
+ <span class="sd"> &quot;total_gpu_rt_cores&quot;: 0,</span>
1258
+ <span class="sd"> &quot;total_gpu_tensor_cores&quot;: 0,</span>
1259
+ <span class="sd"> },</span>
1260
+ <span class="sd"> &quot;memory&quot;: &quot;30&quot;,</span>
1261
+ <span class="sd"> &quot;name&quot;: &quot;n1-standard-8-t4-1&quot;,</span>
1262
+ <span class="sd"> &quot;operating_system&quot;: &quot;linux&quot;,</span>
1263
+ <span class="sd"> &quot;categories&quot;: [{&quot;label&quot;: &quot;Low cores&quot;, &quot;order&quot;: 10}],</span>
1264
+ <span class="sd"> },</span>
1265
+ <span class="sd"> ...</span>
1266
+ <span class="sd"> ]</span>
1267
+ <span class="sd"> &quot;&quot;&quot;</span>
1268
+ <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
1269
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">:</span>
1270
+ <span class="k">if</span> <span class="n">condition</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">[</span><span class="n">key</span><span class="p">]):</span>
1271
+ <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">[</span><span class="n">key</span><span class="p">])</span>
1272
+ <span class="k">return</span> <span class="n">result</span>
1273
+
1274
+ <span class="k">def</span> <span class="nf">find_first</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="p">):</span>
1275
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Find the first instance type that matches a condition.</span>
1276
+
1277
+ <span class="sd"> Please see find_all() above for more details. This method is just a convenience wrapper around find_all() that returns the first result or None if not found.</span>
1278
+
1279
+ <span class="sd"> Args:</span>
1280
+ <span class="sd"> condition (function): A function that takes an instance type and returns True or False.</span>
1281
+
1282
+ <span class="sd"> Returns:</span>
1283
+ <span class="sd"> dict: The first instance type that matches the condition or None if not found.</span>
1284
+ <span class="sd"> &quot;&quot;&quot;</span>
1285
+ <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">condition</span><span class="p">)),</span> <span class="kc">None</span><span class="p">)</span>
1286
+
1287
+ <span class="c1"># DEPRECATED</span>
1288
+ <span class="k">def</span> <span class="nf">get_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">with_misc</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
1289
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the categories structure with renaming ready for some specific widget, such as a Qt Combobox.</span>
1290
+
1291
+ <span class="sd"> Deprecated:</span>
1292
+ <span class="sd"> The get_model() method is deprecated. The `with_misc` parameter is no longer used, which means that this function only serves to rename a few keys. What&#39;s more, the init function ensures that every instance type has a category. This function is no longer needed. Submitters that use it will work but should be updated to use the categories structure directly as it minimizes the levels of indirection necessary to work with it.</span>
1293
+ <span class="sd"> &quot;&quot;&quot;</span>
1294
+ <span class="k">if</span> <span class="n">with_misc</span><span class="p">:</span>
1295
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;with_misc is no longer used&quot;</span><span class="p">)</span>
1296
+ <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
1297
+ <span class="k">for</span> <span class="n">category</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">categories</span><span class="p">:</span>
1298
+ <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
1299
+ <span class="p">{</span>
1300
+ <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="n">category</span><span class="p">[</span><span class="s2">&quot;label&quot;</span><span class="p">],</span>
1301
+ <span class="s2">&quot;content&quot;</span><span class="p">:</span> <span class="p">[</span>
1302
+ <span class="p">{</span><span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="n">k</span><span class="p">[</span><span class="s2">&quot;description&quot;</span><span class="p">],</span> <span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">k</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]}</span>
1303
+ <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">category</span><span class="p">[</span><span class="s2">&quot;content&quot;</span><span class="p">]</span>
1304
+ <span class="p">],</span>
1305
+ <span class="p">}</span>
1306
+ <span class="p">)</span>
1307
+
1308
+ <span class="k">return</span> <span class="n">result</span>
1309
+
1310
+ <span class="c1"># PRIVATE METHODS</span>
1311
+ <span class="nd">@classmethod</span>
1312
+ <span class="k">def</span> <span class="nf">_build_unique</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">instance_types</span><span class="p">):</span>
1313
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Build a dictionary of instance types using the name field as key. This allows fast lookup by name.</span>
1314
+
1315
+ <span class="sd"> Args:</span>
1316
+ <span class="sd"> instance_types (list): A list of instance types.</span>
1317
+
1318
+ <span class="sd"> Returns:</span>
1319
+ <span class="sd"> dict: A dictionary of instance types with the name field as key.</span>
1320
+ <span class="sd"> &quot;&quot;&quot;</span>
1321
+
1322
+ <span class="n">instance_types</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_rewrite_descriptions</span><span class="p">(</span><span class="n">instance_types</span><span class="p">)</span>
1323
+ <span class="n">categories</span> <span class="o">=</span> <span class="p">[</span>
1324
+ <span class="n">category</span>
1325
+ <span class="k">for</span> <span class="n">it</span> <span class="ow">in</span> <span class="n">instance_types</span>
1326
+ <span class="k">for</span> <span class="n">category</span> <span class="ow">in</span> <span class="p">(</span><span class="n">it</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;categories&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
1327
+ <span class="p">]</span>
1328
+ <span class="n">result</span> <span class="o">=</span> <span class="p">{}</span>
1329
+ <span class="k">for</span> <span class="n">it</span> <span class="ow">in</span> <span class="n">instance_types</span><span class="p">:</span>
1330
+ <span class="n">is_gpu</span> <span class="o">=</span> <span class="n">it</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;gpu&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
1331
+ <span class="k">if</span> <span class="n">categories</span><span class="p">:</span>
1332
+ <span class="k">if</span> <span class="n">it</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;categories&quot;</span><span class="p">)</span> <span class="ow">in</span> <span class="p">[[],</span> <span class="kc">None</span><span class="p">]:</span>
1333
+ <span class="k">continue</span>
1334
+ <span class="k">else</span><span class="p">:</span>
1335
+ <span class="c1"># make our own categories GPU/CPU</span>
1336
+ <span class="n">it</span><span class="p">[</span><span class="s2">&quot;categories&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
1337
+ <span class="p">[{</span><span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;GPU&quot;</span><span class="p">,</span> <span class="s2">&quot;order&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">}]</span>
1338
+ <span class="k">if</span> <span class="n">is_gpu</span>
1339
+ <span class="k">else</span> <span class="p">[{</span><span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;CPU&quot;</span><span class="p">,</span> <span class="s2">&quot;order&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}]</span>
1340
+ <span class="p">)</span>
1341
+ <span class="n">result</span><span class="p">[</span><span class="n">it</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]]</span> <span class="o">=</span> <span class="n">it</span>
1342
+
1343
+ <span class="k">return</span> <span class="n">result</span>
1344
+
1345
+
1346
+
1347
+
1348
+ <span class="nd">@classmethod</span>
1349
+ <span class="k">def</span> <span class="nf">_rewrite_descriptions</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">instance_types</span><span class="p">):</span>
1350
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Rewrite the descriptions of the instance types.</span>
1351
+
1352
+ <span class="sd"> If there are both OS types, then the descriptions are prefixed with the OS type.</span>
1353
+
1354
+ <span class="sd"> Args:</span>
1355
+ <span class="sd"> instance_types (list): A list of instance types.</span>
1356
+
1357
+ <span class="sd"> Returns:</span>
1358
+ <span class="sd"> list: A list of instance types with rewritten descriptions.</span>
1359
+ <span class="sd"> &quot;&quot;&quot;</span>
1360
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">instance_types</span><span class="p">:</span>
1361
+ <span class="k">return</span> <span class="n">instance_types</span>
1362
+
1363
+ <span class="n">first_os</span> <span class="o">=</span> <span class="n">instance_types</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;operating_system&quot;</span><span class="p">]</span>
1364
+ <span class="n">dual_platforms</span> <span class="o">=</span> <span class="nb">next</span><span class="p">((</span><span class="n">it</span> <span class="k">for</span> <span class="n">it</span> <span class="ow">in</span> <span class="n">instance_types</span> <span class="k">if</span> <span class="n">it</span><span class="p">[</span><span class="s2">&quot;operating_system&quot;</span><span class="p">]</span> <span class="o">!=</span> <span class="n">first_os</span><span class="p">),</span> <span class="kc">False</span><span class="p">)</span>
1365
+
1366
+ <span class="k">if</span> <span class="n">dual_platforms</span><span class="p">:</span>
1367
+ <span class="k">for</span> <span class="n">it</span> <span class="ow">in</span> <span class="n">instance_types</span><span class="p">:</span>
1368
+ <span class="n">flat_dict</span> <span class="o">=</span> <span class="n">flatten_dict</span><span class="p">(</span><span class="n">it</span><span class="p">)</span>
1369
+ <span class="n">is_gpu</span> <span class="o">=</span> <span class="s2">&quot;gpu_count&quot;</span> <span class="ow">in</span> <span class="n">flat_dict</span>
1370
+ <span class="k">if</span> <span class="n">is_gpu</span><span class="p">:</span>
1371
+ <span class="n">it</span><span class="p">[</span><span class="s2">&quot;description&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">DESCRIPTION_TEMPLATE_OS</span><span class="p">[</span><span class="s2">&quot;gpu&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">flat_dict</span><span class="p">)</span>
1372
+ <span class="k">else</span><span class="p">:</span>
1373
+ <span class="n">it</span><span class="p">[</span><span class="s2">&quot;description&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">DESCRIPTION_TEMPLATE_OS</span><span class="p">[</span><span class="s2">&quot;cpu&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">flat_dict</span><span class="p">)</span>
1374
+ <span class="k">else</span><span class="p">:</span>
1375
+ <span class="k">for</span> <span class="n">it</span> <span class="ow">in</span> <span class="n">instance_types</span><span class="p">:</span>
1376
+ <span class="n">flat_dict</span> <span class="o">=</span> <span class="n">flatten_dict</span><span class="p">(</span><span class="n">it</span><span class="p">)</span>
1377
+ <span class="n">is_gpu</span> <span class="o">=</span> <span class="s2">&quot;gpu_count&quot;</span> <span class="ow">in</span> <span class="n">flat_dict</span>
1378
+ <span class="k">if</span> <span class="n">is_gpu</span><span class="p">:</span>
1379
+ <span class="n">it</span><span class="p">[</span><span class="s2">&quot;description&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">DESCRIPTION_TEMPLATE</span><span class="p">[</span><span class="s2">&quot;gpu&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">flat_dict</span><span class="p">)</span>
1380
+ <span class="k">else</span><span class="p">:</span>
1381
+ <span class="n">it</span><span class="p">[</span><span class="s2">&quot;description&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">DESCRIPTION_TEMPLATE</span><span class="p">[</span><span class="s2">&quot;cpu&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">flat_dict</span><span class="p">)</span>
1382
+
1383
+ <span class="k">return</span> <span class="n">instance_types</span>
1384
+
1385
+ <span class="k">def</span> <span class="nf">_build_categories</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1386
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Build a sorted list of categories where each category contains a sorted list of machines.</span>
1387
+
1388
+ <span class="sd"> Returns:</span>
1389
+ <span class="sd"> list: A list of categories where each category is a dictionary with keys: `label`, `content`, and `order`.</span>
1390
+ <span class="sd"> &quot;&quot;&quot;</span>
1391
+
1392
+ <span class="n">dikt</span> <span class="o">=</span> <span class="p">{}</span>
1393
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">:</span>
1394
+ <span class="n">it</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
1395
+ <span class="n">categories</span> <span class="o">=</span> <span class="n">it</span><span class="p">[</span><span class="s2">&quot;categories&quot;</span><span class="p">]</span>
1396
+ <span class="k">for</span> <span class="n">category</span> <span class="ow">in</span> <span class="n">categories</span><span class="p">:</span>
1397
+ <span class="n">label</span> <span class="o">=</span> <span class="n">category</span><span class="p">[</span><span class="s2">&quot;label&quot;</span><span class="p">]</span>
1398
+ <span class="k">if</span> <span class="n">label</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">dikt</span><span class="p">:</span>
1399
+ <span class="n">dikt</span><span class="p">[</span><span class="n">label</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
1400
+ <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="n">label</span><span class="p">,</span>
1401
+ <span class="s2">&quot;content&quot;</span><span class="p">:</span> <span class="p">[],</span>
1402
+ <span class="s2">&quot;order&quot;</span><span class="p">:</span> <span class="n">category</span><span class="p">[</span><span class="s2">&quot;order&quot;</span><span class="p">],</span>
1403
+ <span class="p">}</span>
1404
+ <span class="n">dikt</span><span class="p">[</span><span class="n">label</span><span class="p">][</span><span class="s2">&quot;content&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">it</span><span class="p">)</span>
1405
+
1406
+ <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
1407
+ <span class="k">for</span> <span class="n">label</span> <span class="ow">in</span> <span class="n">dikt</span><span class="p">:</span>
1408
+ <span class="n">category</span> <span class="o">=</span> <span class="n">dikt</span><span class="p">[</span><span class="n">label</span><span class="p">]</span>
1409
+ <span class="n">category</span><span class="p">[</span><span class="s2">&quot;content&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">k</span><span class="p">:</span> <span class="p">(</span><span class="n">k</span><span class="p">[</span><span class="s2">&quot;cores&quot;</span><span class="p">],</span> <span class="n">k</span><span class="p">[</span><span class="s2">&quot;memory&quot;</span><span class="p">]))</span>
1410
+ <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">category</span><span class="p">)</span>
1411
+ <span class="k">return</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">k</span><span class="p">:</span> <span class="n">k</span><span class="p">[</span><span class="s2">&quot;order&quot;</span><span class="p">])</span>
1412
+
1413
+ <span class="k">def</span> <span class="nf">_get_provider</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1414
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the provider from the first instance type.</span>
1415
+
1416
+ <span class="sd"> Returns:</span>
1417
+ <span class="sd"> str: The provider.</span>
1418
+ <span class="sd"> &quot;&quot;&quot;</span>
1419
+ <span class="n">first_name</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">))</span>
1420
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">first_name</span><span class="p">:</span>
1421
+ <span class="k">return</span> <span class="kc">None</span>
1422
+ <span class="k">if</span> <span class="n">first_name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;cw-&quot;</span><span class="p">):</span>
1423
+ <span class="k">return</span> <span class="s2">&quot;cw&quot;</span>
1424
+ <span class="k">if</span> <span class="s2">&quot;.&quot;</span> <span class="ow">in</span> <span class="n">first_name</span><span class="p">:</span>
1425
+ <span class="k">return</span> <span class="s2">&quot;aws&quot;</span>
1426
+ <span class="k">return</span> <span class="s2">&quot;gcp&quot;</span>
1427
+ </code></pre></div>
1428
+ </details>
1429
+
1430
+
1431
+
1432
+ <div class="doc doc-children">
1433
+
1434
+
1435
+
1436
+
1437
+
1438
+
1439
+
1440
+
1441
+
1442
+ <div class="doc doc-object doc-method">
1443
+
1444
+
1445
+
1446
+ <h3 id="ciocore.hardware_set.HardwareSet.__init__" class="doc doc-heading">
1447
+ <code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance_types</span><span class="p">)</span></code>
1448
+
1449
+ <span class="doc doc-properties">
1450
+ <small class="doc doc-property doc-property-special"><code>special</code></small>
1451
+ </span>
1452
+
1453
+ </h3>
1454
+
1455
+ <div class="doc doc-contents ">
1456
+
1457
+ <p>Initialize the HardwareSet with a list of instance types.
1458
+ Typically, you would access the HardwareSet through the ciocore.data.data() function, which initializes it for you. However, you can also initialize it directly with a list of instance types straight from ciocore.api_client. The difference being that the latter contains all instance types, whereas the former contains only the instance types compatible with the products you have specified, as well as being cached.</p>
1459
+
1460
+ <p><strong>Parameters:</strong></p>
1461
+ <table>
1462
+ <thead>
1463
+ <tr>
1464
+ <th>Name</th>
1465
+ <th>Type</th>
1466
+ <th>Description</th>
1467
+ <th>Default</th>
1468
+ </tr>
1469
+ </thead>
1470
+ <tbody>
1471
+ <tr>
1472
+ <td><code>instance_types</code></td>
1473
+ <td><code>list</code></td>
1474
+ <td><p>A list of instance types.</p></td>
1475
+ <td><em>required</em></td>
1476
+ </tr>
1477
+ </tbody>
1478
+ </table>
1479
+ <p><strong>Returns:</strong></p>
1480
+ <table>
1481
+ <thead>
1482
+ <tr>
1483
+ <th>Type</th>
1484
+ <th>Description</th>
1485
+ </tr>
1486
+ </thead>
1487
+ <tbody>
1488
+ <tr>
1489
+ <td><code>HardwareSet</code></td>
1490
+ <td><p>The initialized HardwareSet.</p></td>
1491
+ </tr>
1492
+ </tbody>
1493
+ </table>
1494
+ <p><strong>Examples:</strong></p>
1495
+ <h6 id="ciocore.hardware_set.HardwareSet.__init__--initialize-with-a-list-of-instance-types">Initialize with a list of instance types</h6>
1496
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">ciocore</span> <span class="kn">import</span> <span class="n">api_client</span>
1497
+ <span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">ciocore.hardware_set</span> <span class="kn">import</span> <span class="n">HardwareSet</span>
1498
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">instance_types</span> <span class="o">=</span> <span class="n">api_client</span><span class="o">.</span><span class="n">request_instance_types</span><span class="p">()</span>
1499
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span> <span class="o">=</span> <span class="n">HardwareSet</span><span class="p">(</span><span class="n">instance_types</span><span class="p">)</span>
1500
+ <span class="o">&lt;</span><span class="n">ciocore</span><span class="o">.</span><span class="n">hardware_set</span><span class="o">.</span><span class="n">HardwareSet</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x104c43d30</span><span class="o">&gt;</span>
1501
+ </code></pre></div>
1502
+ <h6 id="ciocore.hardware_set.HardwareSet.__init__--initialize-implicitly-with-a-list-of-instance-types-from-ciocoredata-recommended">Initialize implicitly with a list of instance types from ciocore.data (recommended).</h6>
1503
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">ciocore</span> <span class="kn">import</span> <span class="n">data</span> <span class="k">as</span> <span class="n">coredata</span>
1504
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">coredata</span><span class="o">.</span><span class="n">init</span><span class="p">(</span><span class="s2">&quot;cinema4d&quot;</span><span class="p">)</span>
1505
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span> <span class="o">=</span> <span class="n">coredata</span><span class="o">.</span><span class="n">data</span><span class="p">()[</span><span class="s2">&quot;instance_types&quot;</span><span class="p">]</span>
1506
+ <span class="o">&lt;</span><span class="n">ciocore</span><span class="o">.</span><span class="n">hardware_set</span><span class="o">.</span><span class="n">HardwareSet</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x104c43ee0</span><span class="o">&gt;</span>
1507
+ </code></pre></div>
1508
+ <div class="admonition note">
1509
+ <p class="admonition-title">Note</p>
1510
+ <p>To avoid repetition, we use the implicit initialization for the examples below.</p>
1511
+ </div>
1512
+
1513
+ <details class="quote">
1514
+ <summary>Source code in <code>ciocore/hardware_set.py</code></summary>
1515
+ <div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance_types</span><span class="p">):</span>
1516
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Initialize the HardwareSet with a list of instance types.</span>
1517
+ <span class="sd"> Typically, you would access the HardwareSet through the ciocore.data.data() function, which initializes it for you. However, you can also initialize it directly with a list of instance types straight from ciocore.api_client. The difference being that the latter contains all instance types, whereas the former contains only the instance types compatible with the products you have specified, as well as being cached.</span>
1518
+
1519
+ <span class="sd"> Args:</span>
1520
+ <span class="sd"> instance_types (list): A list of instance types.</span>
1521
+
1522
+ <span class="sd"> Returns:</span>
1523
+ <span class="sd"> HardwareSet: The initialized HardwareSet.</span>
1524
+
1525
+ <span class="sd"> Examples:</span>
1526
+ <span class="sd"> ### Initialize with a list of instance types</span>
1527
+ <span class="sd"> &gt;&gt;&gt; from ciocore import api_client</span>
1528
+ <span class="sd"> &gt;&gt;&gt; from ciocore.hardware_set import HardwareSet</span>
1529
+ <span class="sd"> &gt;&gt;&gt; instance_types = api_client.request_instance_types()</span>
1530
+ <span class="sd"> &gt;&gt;&gt; hardware_set = HardwareSet(instance_types)</span>
1531
+ <span class="sd"> &lt;ciocore.hardware_set.HardwareSet object at 0x104c43d30&gt;</span>
1532
+
1533
+ <span class="sd"> ### Initialize implicitly with a list of instance types from ciocore.data (recommended).</span>
1534
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1535
+ <span class="sd"> &gt;&gt;&gt; coredata.init(&quot;cinema4d&quot;)</span>
1536
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1537
+ <span class="sd"> &lt;ciocore.hardware_set.HardwareSet object at 0x104c43ee0&gt;</span>
1538
+
1539
+ <span class="sd"> !!! note</span>
1540
+ <span class="sd"> To avoid repetition, we use the implicit initialization for the examples below.</span>
1541
+ <span class="sd"> &quot;&quot;&quot;</span>
1542
+
1543
+ <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_unique</span><span class="p">(</span><span class="n">instance_types</span><span class="p">)</span>
1544
+ <span class="bp">self</span><span class="o">.</span><span class="n">categories</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_categories</span><span class="p">()</span>
1545
+ <span class="bp">self</span><span class="o">.</span><span class="n">provider</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_provider</span><span class="p">()</span>
1546
+ </code></pre></div>
1547
+ </details>
1548
+ </div>
1549
+
1550
+ </div>
1551
+
1552
+
1553
+
1554
+ <div class="doc doc-object doc-method">
1555
+
1556
+
1557
+
1558
+ <h3 id="ciocore.hardware_set.HardwareSet.labels" class="doc doc-heading">
1559
+ <code class="highlight language-python"><span class="n">labels</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></code>
1560
+
1561
+
1562
+ </h3>
1563
+
1564
+ <div class="doc doc-contents ">
1565
+
1566
+ <p>Get the list of category labels.</p>
1567
+
1568
+ <p><strong>Returns:</strong></p>
1569
+ <table>
1570
+ <thead>
1571
+ <tr>
1572
+ <th>Type</th>
1573
+ <th>Description</th>
1574
+ </tr>
1575
+ </thead>
1576
+ <tbody>
1577
+ <tr>
1578
+ <td><code>list</code></td>
1579
+ <td><p>A list of category labels.</p></td>
1580
+ </tr>
1581
+ </tbody>
1582
+ </table>
1583
+ <p><strong>Examples:</strong></p>
1584
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">ciocore</span> <span class="kn">import</span> <span class="n">data</span> <span class="k">as</span> <span class="n">coredata</span>
1585
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">coredata</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
1586
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span> <span class="o">=</span> <span class="n">coredata</span><span class="o">.</span><span class="n">data</span><span class="p">()[</span><span class="s2">&quot;instance_types&quot;</span><span class="p">]</span>
1587
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span><span class="o">.</span><span class="n">labels</span><span class="p">()</span>
1588
+ <span class="p">[</span><span class="s1">&#39;CPU&#39;</span><span class="p">,</span> <span class="s1">&#39;GPU&#39;</span><span class="p">]</span>
1589
+ </code></pre></div>
1590
+
1591
+ <details class="quote">
1592
+ <summary>Source code in <code>ciocore/hardware_set.py</code></summary>
1593
+ <div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">labels</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1594
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the list of category labels.</span>
1595
+
1596
+ <span class="sd"> Returns:</span>
1597
+ <span class="sd"> list: A list of category labels.</span>
1598
+
1599
+ <span class="sd"> Example:</span>
1600
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1601
+ <span class="sd"> &gt;&gt;&gt; coredata.init()</span>
1602
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1603
+ <span class="sd"> &gt;&gt;&gt; hardware_set.labels()</span>
1604
+ <span class="sd"> [&#39;CPU&#39;, &#39;GPU&#39;]</span>
1605
+
1606
+ <span class="sd"> &quot;&quot;&quot;</span>
1607
+ <span class="k">return</span> <span class="p">[</span><span class="n">c</span><span class="p">[</span><span class="s2">&quot;label&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">categories</span><span class="p">]</span>
1608
+ </code></pre></div>
1609
+ </details>
1610
+ </div>
1611
+
1612
+ </div>
1613
+
1614
+
1615
+
1616
+ <div class="doc doc-object doc-method">
1617
+
1618
+
1619
+
1620
+ <h3 id="ciocore.hardware_set.HardwareSet.number_of_categories" class="doc doc-heading">
1621
+ <code class="highlight language-python"><span class="n">number_of_categories</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></code>
1622
+
1623
+
1624
+ </h3>
1625
+
1626
+ <div class="doc doc-contents ">
1627
+
1628
+ <p>Get the number of categories in the data.</p>
1629
+
1630
+ <p><strong>Returns:</strong></p>
1631
+ <table>
1632
+ <thead>
1633
+ <tr>
1634
+ <th>Type</th>
1635
+ <th>Description</th>
1636
+ </tr>
1637
+ </thead>
1638
+ <tbody>
1639
+ <tr>
1640
+ <td><code>int</code></td>
1641
+ <td><p>The number of categories.</p></td>
1642
+ </tr>
1643
+ </tbody>
1644
+ </table>
1645
+ <p><strong>Examples:</strong></p>
1646
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">ciocore</span> <span class="kn">import</span> <span class="n">data</span> <span class="k">as</span> <span class="n">coredata</span>
1647
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">coredata</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
1648
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span> <span class="o">=</span> <span class="n">coredata</span><span class="o">.</span><span class="n">data</span><span class="p">()[</span><span class="s2">&quot;instance_types&quot;</span><span class="p">]</span>
1649
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span><span class="o">.</span><span class="n">number_of_categories</span><span class="p">()</span>
1650
+ <span class="mi">2</span>
1651
+ </code></pre></div>
1652
+
1653
+ <details class="quote">
1654
+ <summary>Source code in <code>ciocore/hardware_set.py</code></summary>
1655
+ <div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">number_of_categories</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1656
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the number of categories in the data.</span>
1657
+
1658
+ <span class="sd"> Returns:</span>
1659
+ <span class="sd"> int: The number of categories.</span>
1660
+
1661
+ <span class="sd"> Example:</span>
1662
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1663
+ <span class="sd"> &gt;&gt;&gt; coredata.init()</span>
1664
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1665
+ <span class="sd"> &gt;&gt;&gt; hardware_set.number_of_categories()</span>
1666
+ <span class="sd"> 2</span>
1667
+
1668
+ <span class="sd"> &quot;&quot;&quot;</span>
1669
+ <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">categories</span><span class="p">)</span>
1670
+ </code></pre></div>
1671
+ </details>
1672
+ </div>
1673
+
1674
+ </div>
1675
+
1676
+
1677
+
1678
+ <div class="doc doc-object doc-method">
1679
+
1680
+
1681
+
1682
+ <h3 id="ciocore.hardware_set.HardwareSet.recategorize" class="doc doc-heading">
1683
+ <code class="highlight language-python"><span class="n">recategorize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partitioner</span><span class="p">)</span></code>
1684
+
1685
+
1686
+ </h3>
1687
+
1688
+ <div class="doc doc-contents ">
1689
+
1690
+ <p>Recategorize the instance types.</p>
1691
+
1692
+ <p><strong>Parameters:</strong></p>
1693
+ <table>
1694
+ <thead>
1695
+ <tr>
1696
+ <th>Name</th>
1697
+ <th>Type</th>
1698
+ <th>Description</th>
1699
+ <th>Default</th>
1700
+ </tr>
1701
+ </thead>
1702
+ <tbody>
1703
+ <tr>
1704
+ <td><code>partitioner</code></td>
1705
+ <td><code>function</code></td>
1706
+ <td><p>A function that takes an instance type and returns a list of categories to assign to it. The function should return an empty list if the instance type should not be categorized.</p></td>
1707
+ <td><em>required</em></td>
1708
+ </tr>
1709
+ </tbody>
1710
+ </table>
1711
+ <p><strong>Examples:</strong></p>
1712
+ <h4 id="ciocore.hardware_set.HardwareSet.recategorize--confirm-current-categories">Confirm current categories</h4>
1713
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">ciocore</span> <span class="kn">import</span> <span class="n">data</span> <span class="k">as</span> <span class="n">coredata</span>
1714
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">coredata</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
1715
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span> <span class="o">=</span> <span class="n">coredata</span><span class="o">.</span><span class="n">data</span><span class="p">()[</span><span class="s2">&quot;instance_types&quot;</span><span class="p">]</span>
1716
+ <span class="o">&gt;&gt;&gt;</span> <span class="nb">print</span><span class="p">(</span><span class="n">hardware_set</span><span class="o">.</span><span class="n">labels</span><span class="p">()</span>
1717
+ <span class="p">[</span><span class="s1">&#39;CPU&#39;</span><span class="p">,</span> <span class="s1">&#39;GPU&#39;</span><span class="p">]</span>
1718
+ </code></pre></div>
1719
+ <h4 id="ciocore.hardware_set.HardwareSet.recategorize--recategorize">Recategorize</h4>
1720
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span><span class="o">.</span><span class="n">recategorize</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="p">[{</span><span class="s1">&#39;label&#39;</span><span class="p">:</span> <span class="s1">&#39;Low cores&#39;</span><span class="p">,</span> <span class="s1">&#39;order&#39;</span><span class="p">:</span> <span class="mi">10</span><span class="p">}]</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="s2">&quot;cores&quot;</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">16</span> <span class="k">else</span> <span class="p">[{</span><span class="s1">&#39;label&#39;</span><span class="p">:</span> <span class="s1">&#39;High cores&#39;</span><span class="p">,</span> <span class="s1">&#39;order&#39;</span><span class="p">:</span> <span class="mi">20</span><span class="p">}])</span>
1721
+ <span class="o">&gt;&gt;&gt;</span> <span class="nb">print</span><span class="p">(</span><span class="n">hardware_set</span><span class="o">.</span><span class="n">labels</span><span class="p">()</span>
1722
+ <span class="p">[</span><span class="s1">&#39;Low cores&#39;</span><span class="p">,</span> <span class="s1">&#39;High cores&#39;</span><span class="p">]</span>
1723
+ </code></pre></div>
1724
+
1725
+ <details class="quote">
1726
+ <summary>Source code in <code>ciocore/hardware_set.py</code></summary>
1727
+ <div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">recategorize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partitioner</span><span class="p">):</span>
1728
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Recategorize the instance types.</span>
1729
+
1730
+ <span class="sd"> Args:</span>
1731
+ <span class="sd"> partitioner (function): A function that takes an instance type and returns a list of categories to assign to it. The function should return an empty list if the instance type should not be categorized.</span>
1732
+
1733
+ <span class="sd"> Example:</span>
1734
+ <span class="sd"> # Confirm current categories</span>
1735
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1736
+ <span class="sd"> &gt;&gt;&gt; coredata.init()</span>
1737
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1738
+ <span class="sd"> &gt;&gt;&gt; print(hardware_set.labels()</span>
1739
+ <span class="sd"> [&#39;CPU&#39;, &#39;GPU&#39;]</span>
1740
+
1741
+ <span class="sd"> # Recategorize</span>
1742
+ <span class="sd"> &gt;&gt;&gt; hardware_set.recategorize(lambda x: [{&#39;label&#39;: &#39;Low cores&#39;, &#39;order&#39;: 10}] if x[&quot;cores&quot;] &lt; 16 else [{&#39;label&#39;: &#39;High cores&#39;, &#39;order&#39;: 20}])</span>
1743
+ <span class="sd"> &gt;&gt;&gt; print(hardware_set.labels()</span>
1744
+ <span class="sd"> [&#39;Low cores&#39;, &#39;High cores&#39;]</span>
1745
+ <span class="sd"> &quot;&quot;&quot;</span>
1746
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">:</span>
1747
+ <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="s2">&quot;categories&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">partitioner</span><span class="p">(</span>
1748
+ <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
1749
+ <span class="p">)</span>
1750
+ <span class="bp">self</span><span class="o">.</span><span class="n">categories</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_categories</span><span class="p">()</span>
1751
+ </code></pre></div>
1752
+ </details>
1753
+ </div>
1754
+
1755
+ </div>
1756
+
1757
+
1758
+
1759
+ <div class="doc doc-object doc-method">
1760
+
1761
+
1762
+
1763
+ <h3 id="ciocore.hardware_set.HardwareSet.find" class="doc doc-heading">
1764
+ <code class="highlight language-python"><span class="n">find</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
1765
+
1766
+
1767
+ </h3>
1768
+
1769
+ <div class="doc doc-contents ">
1770
+
1771
+ <p>Find an instance type by its name (sku).</p>
1772
+
1773
+ <p><strong>Parameters:</strong></p>
1774
+ <table>
1775
+ <thead>
1776
+ <tr>
1777
+ <th>Name</th>
1778
+ <th>Type</th>
1779
+ <th>Description</th>
1780
+ <th>Default</th>
1781
+ </tr>
1782
+ </thead>
1783
+ <tbody>
1784
+ <tr>
1785
+ <td><code>name</code></td>
1786
+ <td><code>str</code></td>
1787
+ <td><p>The name of the instance type.</p></td>
1788
+ <td><em>required</em></td>
1789
+ </tr>
1790
+ </tbody>
1791
+ </table>
1792
+ <p><strong>Returns:</strong></p>
1793
+ <table>
1794
+ <thead>
1795
+ <tr>
1796
+ <th>Type</th>
1797
+ <th>Description</th>
1798
+ </tr>
1799
+ </thead>
1800
+ <tbody>
1801
+ <tr>
1802
+ <td><code>dict</code></td>
1803
+ <td><p>The instance type or None if not found.</p></td>
1804
+ </tr>
1805
+ </tbody>
1806
+ </table>
1807
+ <p><strong>Examples:</strong></p>
1808
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">ciocore</span> <span class="kn">import</span> <span class="n">data</span> <span class="k">as</span> <span class="n">coredata</span>
1809
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">coredata</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
1810
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span> <span class="o">=</span> <span class="n">coredata</span><span class="o">.</span><span class="n">data</span><span class="p">()[</span><span class="s2">&quot;instance_types&quot;</span><span class="p">]</span>
1811
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&quot;n2-highmem-80&quot;</span><span class="p">)</span>
1812
+ <span class="p">{</span>
1813
+ <span class="s1">&#39;cores&#39;</span><span class="p">:</span> <span class="mi">80</span><span class="p">,</span>
1814
+ <span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;80 core, 640GB Mem&#39;</span><span class="p">,</span>
1815
+ <span class="s1">&#39;gpu&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
1816
+ <span class="s1">&#39;memory&#39;</span><span class="p">:</span> <span class="s1">&#39;640&#39;</span><span class="p">,</span>
1817
+ <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;n2-highmem-80&#39;</span><span class="p">,</span>
1818
+ <span class="s1">&#39;operating_system&#39;</span><span class="p">:</span> <span class="s1">&#39;linux&#39;</span><span class="p">,</span>
1819
+ <span class="s1">&#39;categories&#39;</span><span class="p">:</span> <span class="p">[</span>
1820
+ <span class="p">{</span><span class="s1">&#39;label&#39;</span><span class="p">:</span> <span class="s1">&#39;High cores&#39;</span><span class="p">,</span> <span class="s1">&#39;order&#39;</span><span class="p">:</span> <span class="mi">20</span><span class="p">}</span>
1821
+ <span class="p">]</span>
1822
+ <span class="p">}</span>
1823
+ </code></pre></div>
1824
+
1825
+ <details class="quote">
1826
+ <summary>Source code in <code>ciocore/hardware_set.py</code></summary>
1827
+ <div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">find</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
1828
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Find an instance type by its name (sku).</span>
1829
+
1830
+ <span class="sd"> Args:</span>
1831
+ <span class="sd"> name (str): The name of the instance type.</span>
1832
+
1833
+ <span class="sd"> Returns:</span>
1834
+ <span class="sd"> dict: The instance type or None if not found.</span>
1835
+ <span class="sd"> Example:</span>
1836
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1837
+ <span class="sd"> &gt;&gt;&gt; coredata.init()</span>
1838
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1839
+ <span class="sd"> &gt;&gt;&gt; hardware_set.find(&quot;n2-highmem-80&quot;)</span>
1840
+ <span class="sd"> {</span>
1841
+ <span class="sd"> &#39;cores&#39;: 80,</span>
1842
+ <span class="sd"> &#39;description&#39;: &#39;80 core, 640GB Mem&#39;,</span>
1843
+ <span class="sd"> &#39;gpu&#39;: None,</span>
1844
+ <span class="sd"> &#39;memory&#39;: &#39;640&#39;,</span>
1845
+ <span class="sd"> &#39;name&#39;: &#39;n2-highmem-80&#39;,</span>
1846
+ <span class="sd"> &#39;operating_system&#39;: &#39;linux&#39;,</span>
1847
+ <span class="sd"> &#39;categories&#39;: [</span>
1848
+ <span class="sd"> {&#39;label&#39;: &#39;High cores&#39;, &#39;order&#39;: 20}</span>
1849
+ <span class="sd"> ]</span>
1850
+ <span class="sd"> }</span>
1851
+
1852
+ <span class="sd"> &quot;&quot;&quot;</span>
1853
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">category</span><span class="p">:</span>
1854
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
1855
+
1856
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">find_first</span><span class="p">(</span>
1857
+ <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="n">name</span>
1858
+ <span class="ow">and</span> <span class="n">category</span> <span class="ow">in</span> <span class="p">[</span><span class="n">c</span><span class="p">[</span><span class="s2">&quot;label&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">x</span><span class="p">[</span><span class="s2">&quot;categories&quot;</span><span class="p">]]</span>
1859
+ <span class="p">)</span>
1860
+ </code></pre></div>
1861
+ </details>
1862
+ </div>
1863
+
1864
+ </div>
1865
+
1866
+
1867
+
1868
+ <div class="doc doc-object doc-method">
1869
+
1870
+
1871
+
1872
+ <h3 id="ciocore.hardware_set.HardwareSet.find_category" class="doc doc-heading">
1873
+ <code class="highlight language-python"><span class="n">find_category</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">label</span><span class="p">)</span></code>
1874
+
1875
+
1876
+ </h3>
1877
+
1878
+ <div class="doc doc-contents ">
1879
+
1880
+ <p>Find a category by label.</p>
1881
+
1882
+ <p><strong>Parameters:</strong></p>
1883
+ <table>
1884
+ <thead>
1885
+ <tr>
1886
+ <th>Name</th>
1887
+ <th>Type</th>
1888
+ <th>Description</th>
1889
+ <th>Default</th>
1890
+ </tr>
1891
+ </thead>
1892
+ <tbody>
1893
+ <tr>
1894
+ <td><code>label</code></td>
1895
+ <td><code>str</code></td>
1896
+ <td><p>The label of the category.</p></td>
1897
+ <td><em>required</em></td>
1898
+ </tr>
1899
+ </tbody>
1900
+ </table>
1901
+ <p><strong>Returns:</strong></p>
1902
+ <table>
1903
+ <thead>
1904
+ <tr>
1905
+ <th>Type</th>
1906
+ <th>Description</th>
1907
+ </tr>
1908
+ </thead>
1909
+ <tbody>
1910
+ <tr>
1911
+ <td><code>dict</code></td>
1912
+ <td><p>The category or None if not found.</p></td>
1913
+ </tr>
1914
+ </tbody>
1915
+ </table>
1916
+ <p><strong>Examples:</strong></p>
1917
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">ciocore</span> <span class="kn">import</span> <span class="n">data</span> <span class="k">as</span> <span class="n">coredata</span>
1918
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">coredata</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
1919
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span> <span class="o">=</span> <span class="n">coredata</span><span class="o">.</span><span class="n">data</span><span class="p">()[</span><span class="s2">&quot;instance_types&quot;</span><span class="p">]</span>
1920
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span><span class="o">.</span><span class="n">find_category</span><span class="p">(</span><span class="s2">&quot;High cores&quot;</span><span class="p">)</span>
1921
+ <span class="p">{</span>
1922
+ <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Low cores&quot;</span><span class="p">,</span>
1923
+ <span class="s2">&quot;content&quot;</span><span class="p">:</span> <span class="p">[</span>
1924
+ <span class="p">{</span>
1925
+ <span class="s2">&quot;cores&quot;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span>
1926
+ <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;8 core, 52GB Mem&quot;</span><span class="p">,</span>
1927
+ <span class="s2">&quot;gpu&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
1928
+ <span class="s2">&quot;memory&quot;</span><span class="p">:</span> <span class="s2">&quot;52&quot;</span><span class="p">,</span>
1929
+ <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;n1-highmem-8&quot;</span><span class="p">,</span>
1930
+ <span class="s2">&quot;operating_system&quot;</span><span class="p">:</span> <span class="s2">&quot;linux&quot;</span><span class="p">,</span>
1931
+ <span class="s2">&quot;categories&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Low cores&quot;</span><span class="p">,</span> <span class="s2">&quot;order&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">}],</span>
1932
+ <span class="p">},</span>
1933
+ <span class="p">{</span>
1934
+ <span class="s2">&quot;cores&quot;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span>
1935
+ <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;8 core, 7.2GB Mem&quot;</span><span class="p">,</span>
1936
+ <span class="s2">&quot;gpu&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
1937
+ <span class="s2">&quot;memory&quot;</span><span class="p">:</span> <span class="s2">&quot;7.2&quot;</span><span class="p">,</span>
1938
+ <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;n1-highcpu-8&quot;</span><span class="p">,</span>
1939
+ <span class="s2">&quot;operating_system&quot;</span><span class="p">:</span> <span class="s2">&quot;linux&quot;</span><span class="p">,</span>
1940
+ <span class="s2">&quot;categories&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Low cores&quot;</span><span class="p">,</span> <span class="s2">&quot;order&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">}],</span>
1941
+ <span class="p">},</span>
1942
+ <span class="o">...</span>
1943
+ <span class="p">],</span>
1944
+ <span class="s2">&quot;order&quot;</span><span class="p">:</span> <span class="mi">10</span>
1945
+ <span class="p">}</span>
1946
+ </code></pre></div>
1947
+
1948
+ <details class="quote">
1949
+ <summary>Source code in <code>ciocore/hardware_set.py</code></summary>
1950
+ <div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">find_category</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">label</span><span class="p">):</span>
1951
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Find a category by label.</span>
1952
+
1953
+ <span class="sd"> Args:</span>
1954
+ <span class="sd"> label (str): The label of the category.</span>
1955
+
1956
+ <span class="sd"> Returns:</span>
1957
+ <span class="sd"> dict: The category or None if not found.</span>
1958
+ <span class="sd"> Example:</span>
1959
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
1960
+ <span class="sd"> &gt;&gt;&gt; coredata.init()</span>
1961
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
1962
+ <span class="sd"> &gt;&gt;&gt; hardware_set.find_category(&quot;High cores&quot;)</span>
1963
+ <span class="sd"> {</span>
1964
+ <span class="sd"> &quot;label&quot;: &quot;Low cores&quot;,</span>
1965
+ <span class="sd"> &quot;content&quot;: [</span>
1966
+ <span class="sd"> {</span>
1967
+ <span class="sd"> &quot;cores&quot;: 8,</span>
1968
+ <span class="sd"> &quot;description&quot;: &quot;8 core, 52GB Mem&quot;,</span>
1969
+ <span class="sd"> &quot;gpu&quot;: None,</span>
1970
+ <span class="sd"> &quot;memory&quot;: &quot;52&quot;,</span>
1971
+ <span class="sd"> &quot;name&quot;: &quot;n1-highmem-8&quot;,</span>
1972
+ <span class="sd"> &quot;operating_system&quot;: &quot;linux&quot;,</span>
1973
+ <span class="sd"> &quot;categories&quot;: [{&quot;label&quot;: &quot;Low cores&quot;, &quot;order&quot;: 10}],</span>
1974
+ <span class="sd"> },</span>
1975
+ <span class="sd"> {</span>
1976
+ <span class="sd"> &quot;cores&quot;: 8,</span>
1977
+ <span class="sd"> &quot;description&quot;: &quot;8 core, 7.2GB Mem&quot;,</span>
1978
+ <span class="sd"> &quot;gpu&quot;: None,</span>
1979
+ <span class="sd"> &quot;memory&quot;: &quot;7.2&quot;,</span>
1980
+ <span class="sd"> &quot;name&quot;: &quot;n1-highcpu-8&quot;,</span>
1981
+ <span class="sd"> &quot;operating_system&quot;: &quot;linux&quot;,</span>
1982
+ <span class="sd"> &quot;categories&quot;: [{&quot;label&quot;: &quot;Low cores&quot;, &quot;order&quot;: 10}],</span>
1983
+ <span class="sd"> },</span>
1984
+ <span class="sd"> ...</span>
1985
+ <span class="sd"> ],</span>
1986
+ <span class="sd"> &quot;order&quot;: 10</span>
1987
+ <span class="sd"> }</span>
1988
+ <span class="sd"> &quot;&quot;&quot;</span>
1989
+ <span class="k">return</span> <span class="nb">next</span><span class="p">((</span><span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">categories</span> <span class="k">if</span> <span class="n">c</span><span class="p">[</span><span class="s2">&quot;label&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="n">label</span><span class="p">),</span> <span class="kc">None</span><span class="p">)</span>
1990
+ </code></pre></div>
1991
+ </details>
1992
+ </div>
1993
+
1994
+ </div>
1995
+
1996
+
1997
+
1998
+ <div class="doc doc-object doc-method">
1999
+
2000
+
2001
+
2002
+ <h3 id="ciocore.hardware_set.HardwareSet.find_all" class="doc doc-heading">
2003
+ <code class="highlight language-python"><span class="n">find_all</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="p">)</span></code>
2004
+
2005
+
2006
+ </h3>
2007
+
2008
+ <div class="doc doc-contents ">
2009
+
2010
+ <p>Find all instance types that match a condition.</p>
2011
+
2012
+ <p><strong>Parameters:</strong></p>
2013
+ <table>
2014
+ <thead>
2015
+ <tr>
2016
+ <th>Name</th>
2017
+ <th>Type</th>
2018
+ <th>Description</th>
2019
+ <th>Default</th>
2020
+ </tr>
2021
+ </thead>
2022
+ <tbody>
2023
+ <tr>
2024
+ <td><code>condition</code></td>
2025
+ <td><code>function</code></td>
2026
+ <td><p>A function that takes an instance type and returns True or False.</p></td>
2027
+ <td><em>required</em></td>
2028
+ </tr>
2029
+ </tbody>
2030
+ </table>
2031
+ <p><strong>Returns:</strong></p>
2032
+ <table>
2033
+ <thead>
2034
+ <tr>
2035
+ <th>Type</th>
2036
+ <th>Description</th>
2037
+ </tr>
2038
+ </thead>
2039
+ <tbody>
2040
+ <tr>
2041
+ <td><code>list</code></td>
2042
+ <td><p>A list of instance types that match the condition.</p></td>
2043
+ </tr>
2044
+ </tbody>
2045
+ </table>
2046
+ <p><strong>Examples:</strong></p>
2047
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">ciocore</span> <span class="kn">import</span> <span class="n">data</span> <span class="k">as</span> <span class="n">coredata</span>
2048
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">coredata</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
2049
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span> <span class="o">=</span> <span class="n">coredata</span><span class="o">.</span><span class="n">data</span><span class="p">()[</span><span class="s2">&quot;instance_types&quot;</span><span class="p">]</span>
2050
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">hardware_set</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="s2">&quot;gpu&quot;</span><span class="p">])</span>
2051
+ <span class="p">[</span>
2052
+ <span class="p">{</span>
2053
+ <span class="s2">&quot;cores&quot;</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span>
2054
+ <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;4 core, 15GB Mem (1 T4 Tensor GPU with 16GB Mem)&quot;</span><span class="p">,</span>
2055
+ <span class="s2">&quot;gpu&quot;</span><span class="p">:</span> <span class="p">{</span>
2056
+ <span class="s2">&quot;gpu_architecture&quot;</span><span class="p">:</span> <span class="s2">&quot;NVIDIA Turing&quot;</span><span class="p">,</span>
2057
+ <span class="s2">&quot;gpu_count&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
2058
+ <span class="s2">&quot;gpu_cuda_cores&quot;</span><span class="p">:</span> <span class="mi">2560</span><span class="p">,</span>
2059
+ <span class="s2">&quot;gpu_memory&quot;</span><span class="p">:</span> <span class="s2">&quot;16&quot;</span><span class="p">,</span>
2060
+ <span class="s2">&quot;gpu_model&quot;</span><span class="p">:</span> <span class="s2">&quot;T4 Tensor&quot;</span><span class="p">,</span>
2061
+ <span class="s2">&quot;gpu_rt_cores&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
2062
+ <span class="s2">&quot;gpu_tensor_cores&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
2063
+ <span class="s2">&quot;total_gpu_cuda_cores&quot;</span><span class="p">:</span> <span class="mi">2560</span><span class="p">,</span>
2064
+ <span class="s2">&quot;total_gpu_memory&quot;</span><span class="p">:</span> <span class="s2">&quot;16&quot;</span><span class="p">,</span>
2065
+ <span class="s2">&quot;total_gpu_rt_cores&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
2066
+ <span class="s2">&quot;total_gpu_tensor_cores&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
2067
+ <span class="p">},</span>
2068
+ <span class="s2">&quot;memory&quot;</span><span class="p">:</span> <span class="s2">&quot;15&quot;</span><span class="p">,</span>
2069
+ <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;n1-standard-4-t4-1&quot;</span><span class="p">,</span>
2070
+ <span class="s2">&quot;operating_system&quot;</span><span class="p">:</span> <span class="s2">&quot;linux&quot;</span><span class="p">,</span>
2071
+ <span class="s2">&quot;categories&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Low cores&quot;</span><span class="p">,</span> <span class="s2">&quot;order&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">}],</span>
2072
+ <span class="p">},</span>
2073
+ <span class="p">{</span>
2074
+ <span class="s2">&quot;cores&quot;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span>
2075
+ <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;8 core, 30GB Mem (1 T4 Tensor GPU with 16GB Mem)&quot;</span><span class="p">,</span>
2076
+ <span class="s2">&quot;gpu&quot;</span><span class="p">:</span> <span class="p">{</span>
2077
+ <span class="s2">&quot;gpu_architecture&quot;</span><span class="p">:</span> <span class="s2">&quot;NVIDIA Turing&quot;</span><span class="p">,</span>
2078
+ <span class="s2">&quot;gpu_count&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
2079
+ <span class="s2">&quot;gpu_cuda_cores&quot;</span><span class="p">:</span> <span class="mi">2560</span><span class="p">,</span>
2080
+ <span class="s2">&quot;gpu_memory&quot;</span><span class="p">:</span> <span class="s2">&quot;16&quot;</span><span class="p">,</span>
2081
+ <span class="s2">&quot;gpu_model&quot;</span><span class="p">:</span> <span class="s2">&quot;T4 Tensor&quot;</span><span class="p">,</span>
2082
+ <span class="s2">&quot;gpu_rt_cores&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
2083
+ <span class="s2">&quot;gpu_tensor_cores&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
2084
+ <span class="s2">&quot;total_gpu_cuda_cores&quot;</span><span class="p">:</span> <span class="mi">2560</span><span class="p">,</span>
2085
+ <span class="s2">&quot;total_gpu_memory&quot;</span><span class="p">:</span> <span class="s2">&quot;16&quot;</span><span class="p">,</span>
2086
+ <span class="s2">&quot;total_gpu_rt_cores&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
2087
+ <span class="s2">&quot;total_gpu_tensor_cores&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
2088
+ <span class="p">},</span>
2089
+ <span class="s2">&quot;memory&quot;</span><span class="p">:</span> <span class="s2">&quot;30&quot;</span><span class="p">,</span>
2090
+ <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;n1-standard-8-t4-1&quot;</span><span class="p">,</span>
2091
+ <span class="s2">&quot;operating_system&quot;</span><span class="p">:</span> <span class="s2">&quot;linux&quot;</span><span class="p">,</span>
2092
+ <span class="s2">&quot;categories&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Low cores&quot;</span><span class="p">,</span> <span class="s2">&quot;order&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">}],</span>
2093
+ <span class="p">},</span>
2094
+ <span class="o">...</span>
2095
+ <span class="p">]</span>
2096
+ </code></pre></div>
2097
+
2098
+ <details class="quote">
2099
+ <summary>Source code in <code>ciocore/hardware_set.py</code></summary>
2100
+ <div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">find_all</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="p">):</span>
2101
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Find all instance types that match a condition.</span>
2102
+
2103
+ <span class="sd"> Args:</span>
2104
+ <span class="sd"> condition (function): A function that takes an instance type and returns True or False.</span>
2105
+
2106
+ <span class="sd"> Returns:</span>
2107
+ <span class="sd"> list: A list of instance types that match the condition.</span>
2108
+
2109
+ <span class="sd"> Example:</span>
2110
+ <span class="sd"> &gt;&gt;&gt; from ciocore import data as coredata</span>
2111
+ <span class="sd"> &gt;&gt;&gt; coredata.init()</span>
2112
+ <span class="sd"> &gt;&gt;&gt; hardware_set = coredata.data()[&quot;instance_types&quot;]</span>
2113
+ <span class="sd"> &gt;&gt;&gt; hardware_set.find_all(lambda x: x[&quot;gpu&quot;])</span>
2114
+ <span class="sd"> [</span>
2115
+ <span class="sd"> {</span>
2116
+ <span class="sd"> &quot;cores&quot;: 4,</span>
2117
+ <span class="sd"> &quot;description&quot;: &quot;4 core, 15GB Mem (1 T4 Tensor GPU with 16GB Mem)&quot;,</span>
2118
+ <span class="sd"> &quot;gpu&quot;: {</span>
2119
+ <span class="sd"> &quot;gpu_architecture&quot;: &quot;NVIDIA Turing&quot;,</span>
2120
+ <span class="sd"> &quot;gpu_count&quot;: 1,</span>
2121
+ <span class="sd"> &quot;gpu_cuda_cores&quot;: 2560,</span>
2122
+ <span class="sd"> &quot;gpu_memory&quot;: &quot;16&quot;,</span>
2123
+ <span class="sd"> &quot;gpu_model&quot;: &quot;T4 Tensor&quot;,</span>
2124
+ <span class="sd"> &quot;gpu_rt_cores&quot;: 0,</span>
2125
+ <span class="sd"> &quot;gpu_tensor_cores&quot;: 0,</span>
2126
+ <span class="sd"> &quot;total_gpu_cuda_cores&quot;: 2560,</span>
2127
+ <span class="sd"> &quot;total_gpu_memory&quot;: &quot;16&quot;,</span>
2128
+ <span class="sd"> &quot;total_gpu_rt_cores&quot;: 0,</span>
2129
+ <span class="sd"> &quot;total_gpu_tensor_cores&quot;: 0,</span>
2130
+ <span class="sd"> },</span>
2131
+ <span class="sd"> &quot;memory&quot;: &quot;15&quot;,</span>
2132
+ <span class="sd"> &quot;name&quot;: &quot;n1-standard-4-t4-1&quot;,</span>
2133
+ <span class="sd"> &quot;operating_system&quot;: &quot;linux&quot;,</span>
2134
+ <span class="sd"> &quot;categories&quot;: [{&quot;label&quot;: &quot;Low cores&quot;, &quot;order&quot;: 10}],</span>
2135
+ <span class="sd"> },</span>
2136
+ <span class="sd"> {</span>
2137
+ <span class="sd"> &quot;cores&quot;: 8,</span>
2138
+ <span class="sd"> &quot;description&quot;: &quot;8 core, 30GB Mem (1 T4 Tensor GPU with 16GB Mem)&quot;,</span>
2139
+ <span class="sd"> &quot;gpu&quot;: {</span>
2140
+ <span class="sd"> &quot;gpu_architecture&quot;: &quot;NVIDIA Turing&quot;,</span>
2141
+ <span class="sd"> &quot;gpu_count&quot;: 1,</span>
2142
+ <span class="sd"> &quot;gpu_cuda_cores&quot;: 2560,</span>
2143
+ <span class="sd"> &quot;gpu_memory&quot;: &quot;16&quot;,</span>
2144
+ <span class="sd"> &quot;gpu_model&quot;: &quot;T4 Tensor&quot;,</span>
2145
+ <span class="sd"> &quot;gpu_rt_cores&quot;: 0,</span>
2146
+ <span class="sd"> &quot;gpu_tensor_cores&quot;: 0,</span>
2147
+ <span class="sd"> &quot;total_gpu_cuda_cores&quot;: 2560,</span>
2148
+ <span class="sd"> &quot;total_gpu_memory&quot;: &quot;16&quot;,</span>
2149
+ <span class="sd"> &quot;total_gpu_rt_cores&quot;: 0,</span>
2150
+ <span class="sd"> &quot;total_gpu_tensor_cores&quot;: 0,</span>
2151
+ <span class="sd"> },</span>
2152
+ <span class="sd"> &quot;memory&quot;: &quot;30&quot;,</span>
2153
+ <span class="sd"> &quot;name&quot;: &quot;n1-standard-8-t4-1&quot;,</span>
2154
+ <span class="sd"> &quot;operating_system&quot;: &quot;linux&quot;,</span>
2155
+ <span class="sd"> &quot;categories&quot;: [{&quot;label&quot;: &quot;Low cores&quot;, &quot;order&quot;: 10}],</span>
2156
+ <span class="sd"> },</span>
2157
+ <span class="sd"> ...</span>
2158
+ <span class="sd"> ]</span>
2159
+ <span class="sd"> &quot;&quot;&quot;</span>
2160
+ <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
2161
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">:</span>
2162
+ <span class="k">if</span> <span class="n">condition</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">[</span><span class="n">key</span><span class="p">]):</span>
2163
+ <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">instance_types</span><span class="p">[</span><span class="n">key</span><span class="p">])</span>
2164
+ <span class="k">return</span> <span class="n">result</span>
2165
+ </code></pre></div>
2166
+ </details>
2167
+ </div>
2168
+
2169
+ </div>
2170
+
2171
+
2172
+
2173
+ <div class="doc doc-object doc-method">
2174
+
2175
+
2176
+
2177
+ <h3 id="ciocore.hardware_set.HardwareSet.find_first" class="doc doc-heading">
2178
+ <code class="highlight language-python"><span class="n">find_first</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="p">)</span></code>
2179
+
2180
+
2181
+ </h3>
2182
+
2183
+ <div class="doc doc-contents ">
2184
+
2185
+ <p>Find the first instance type that matches a condition.</p>
2186
+ <p>Please see find_all() above for more details. This method is just a convenience wrapper around find_all() that returns the first result or None if not found.</p>
2187
+
2188
+ <p><strong>Parameters:</strong></p>
2189
+ <table>
2190
+ <thead>
2191
+ <tr>
2192
+ <th>Name</th>
2193
+ <th>Type</th>
2194
+ <th>Description</th>
2195
+ <th>Default</th>
2196
+ </tr>
2197
+ </thead>
2198
+ <tbody>
2199
+ <tr>
2200
+ <td><code>condition</code></td>
2201
+ <td><code>function</code></td>
2202
+ <td><p>A function that takes an instance type and returns True or False.</p></td>
2203
+ <td><em>required</em></td>
2204
+ </tr>
2205
+ </tbody>
2206
+ </table>
2207
+ <p><strong>Returns:</strong></p>
2208
+ <table>
2209
+ <thead>
2210
+ <tr>
2211
+ <th>Type</th>
2212
+ <th>Description</th>
2213
+ </tr>
2214
+ </thead>
2215
+ <tbody>
2216
+ <tr>
2217
+ <td><code>dict</code></td>
2218
+ <td><p>The first instance type that matches the condition or None if not found.</p></td>
2219
+ </tr>
2220
+ </tbody>
2221
+ </table>
2222
+ <details class="quote">
2223
+ <summary>Source code in <code>ciocore/hardware_set.py</code></summary>
2224
+ <div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">find_first</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="p">):</span>
2225
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Find the first instance type that matches a condition.</span>
2226
+
2227
+ <span class="sd"> Please see find_all() above for more details. This method is just a convenience wrapper around find_all() that returns the first result or None if not found.</span>
2228
+
2229
+ <span class="sd"> Args:</span>
2230
+ <span class="sd"> condition (function): A function that takes an instance type and returns True or False.</span>
2231
+
2232
+ <span class="sd"> Returns:</span>
2233
+ <span class="sd"> dict: The first instance type that matches the condition or None if not found.</span>
2234
+ <span class="sd"> &quot;&quot;&quot;</span>
2235
+ <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">condition</span><span class="p">)),</span> <span class="kc">None</span><span class="p">)</span>
2236
+ </code></pre></div>
2237
+ </details>
2238
+ </div>
2239
+
2240
+ </div>
2241
+
2242
+
2243
+
2244
+ <div class="doc doc-object doc-method">
2245
+
2246
+
2247
+
2248
+ <h3 id="ciocore.hardware_set.HardwareSet.get_model" class="doc doc-heading">
2249
+ <code class="highlight language-python"><span class="n">get_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">with_misc</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></code>
2250
+
2251
+
2252
+ </h3>
2253
+
2254
+ <div class="doc doc-contents ">
2255
+
2256
+ <p>Get the categories structure with renaming ready for some specific widget, such as a Qt Combobox.</p>
2257
+ <div class="admonition deprecated">
2258
+ <p class="admonition-title">Deprecated</p>
2259
+ <p>The get_model() method is deprecated. The <code>with_misc</code> parameter is no longer used, which means that this function only serves to rename a few keys. What's more, the init function ensures that every instance type has a category. This function is no longer needed. Submitters that use it will work but should be updated to use the categories structure directly as it minimizes the levels of indirection necessary to work with it.</p>
2260
+ </div>
2261
+
2262
+ <details class="quote">
2263
+ <summary>Source code in <code>ciocore/hardware_set.py</code></summary>
2264
+ <div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">get_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">with_misc</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
2265
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the categories structure with renaming ready for some specific widget, such as a Qt Combobox.</span>
2266
+
2267
+ <span class="sd"> Deprecated:</span>
2268
+ <span class="sd"> The get_model() method is deprecated. The `with_misc` parameter is no longer used, which means that this function only serves to rename a few keys. What&#39;s more, the init function ensures that every instance type has a category. This function is no longer needed. Submitters that use it will work but should be updated to use the categories structure directly as it minimizes the levels of indirection necessary to work with it.</span>
2269
+ <span class="sd"> &quot;&quot;&quot;</span>
2270
+ <span class="k">if</span> <span class="n">with_misc</span><span class="p">:</span>
2271
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;with_misc is no longer used&quot;</span><span class="p">)</span>
2272
+ <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
2273
+ <span class="k">for</span> <span class="n">category</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">categories</span><span class="p">:</span>
2274
+ <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
2275
+ <span class="p">{</span>
2276
+ <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="n">category</span><span class="p">[</span><span class="s2">&quot;label&quot;</span><span class="p">],</span>
2277
+ <span class="s2">&quot;content&quot;</span><span class="p">:</span> <span class="p">[</span>
2278
+ <span class="p">{</span><span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="n">k</span><span class="p">[</span><span class="s2">&quot;description&quot;</span><span class="p">],</span> <span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">k</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]}</span>
2279
+ <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">category</span><span class="p">[</span><span class="s2">&quot;content&quot;</span><span class="p">]</span>
2280
+ <span class="p">],</span>
2281
+ <span class="p">}</span>
2282
+ <span class="p">)</span>
2283
+
2284
+ <span class="k">return</span> <span class="n">result</span>
2285
+ </code></pre></div>
2286
+ </details>
2287
+ </div>
2288
+
2289
+ </div>
2290
+
2291
+
2292
+
2293
+
2294
+
2295
+ </div>
2296
+
2297
+ </div>
2298
+
2299
+ </div>
2300
+
2301
+
2302
+
2303
+
2304
+
2305
+
2306
+
2307
+
2308
+ </div>
2309
+
2310
+ </div>
2311
+
2312
+ </div>
2313
+
2314
+
2315
+
2316
+
2317
+
2318
+
2319
+ </article>
2320
+ </div>
2321
+
2322
+
2323
+ </div>
2324
+
2325
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
2326
+
2327
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
2328
+ Back to top
2329
+ </button>
2330
+
2331
+ </main>
2332
+
2333
+ <footer class="md-footer">
2334
+
2335
+ <div class="md-footer-meta md-typeset">
2336
+ <div class="md-footer-meta__inner md-grid">
2337
+ <div class="md-copyright">
2338
+
2339
+ <div class="md-copyright__highlight">
2340
+ Copyright &copy; 2023, CoreWeave.
2341
+ </div>
2342
+
2343
+
2344
+ Made with
2345
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
2346
+ Material for MkDocs
2347
+ </a>
2348
+
2349
+ </div>
2350
+
2351
+ </div>
2352
+ </div>
2353
+ </footer>
2354
+
2355
+ </div>
2356
+ <div class="md-dialog" data-md-component="dialog">
2357
+ <div class="md-dialog__inner md-typeset"></div>
2358
+ </div>
2359
+
2360
+ <script id="__config" type="application/json">{"base": "../..", "features": ["navigation.expand", "navigation.instant", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "navigation.top"], "search": "../../assets/javascripts/workers/search.dfff1995.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
2361
+
2362
+
2363
+ <script src="../../assets/javascripts/bundle.4e31edb1.min.js"></script>
2364
+
2365
+
2366
+ </body>
2367
+ </html>