@milaboratories/pl-model-common 1.25.1 → 1.25.3

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.
Files changed (288) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  2. package/dist/author_marker.d.ts +9 -6
  3. package/dist/base32_encode.cjs +40 -46
  4. package/dist/base32_encode.cjs.map +1 -1
  5. package/dist/base32_encode.js +40 -45
  6. package/dist/base32_encode.js.map +1 -1
  7. package/dist/base64.cjs +5 -4
  8. package/dist/base64.cjs.map +1 -1
  9. package/dist/base64.d.ts +10 -6
  10. package/dist/base64.js +5 -3
  11. package/dist/base64.js.map +1 -1
  12. package/dist/block_state.d.ts +21 -23
  13. package/dist/bmodel/block_config.cjs +9 -10
  14. package/dist/bmodel/block_config.cjs.map +1 -1
  15. package/dist/bmodel/block_config.d.ts +53 -72
  16. package/dist/bmodel/block_config.js +9 -9
  17. package/dist/bmodel/block_config.js.map +1 -1
  18. package/dist/bmodel/code.cjs +7 -6
  19. package/dist/bmodel/code.cjs.map +1 -1
  20. package/dist/bmodel/code.d.ts +17 -13
  21. package/dist/bmodel/code.js +6 -4
  22. package/dist/bmodel/code.js.map +1 -1
  23. package/dist/bmodel/container.d.ts +46 -44
  24. package/dist/bmodel/index.cjs +3 -0
  25. package/dist/bmodel/index.d.ts +5 -6
  26. package/dist/bmodel/index.js +3 -0
  27. package/dist/bmodel/normalization.cjs +90 -106
  28. package/dist/bmodel/normalization.cjs.map +1 -1
  29. package/dist/bmodel/normalization.d.ts +7 -3
  30. package/dist/bmodel/normalization.js +90 -105
  31. package/dist/bmodel/normalization.js.map +1 -1
  32. package/dist/bmodel/types.d.ts +4 -1
  33. package/dist/branding.d.ts +5 -5
  34. package/dist/common_types.d.ts +19 -15
  35. package/dist/driver_kit.d.ts +25 -17
  36. package/dist/drivers/ChunkedStreamReader.cjs +168 -203
  37. package/dist/drivers/ChunkedStreamReader.cjs.map +1 -1
  38. package/dist/drivers/ChunkedStreamReader.d.ts +104 -100
  39. package/dist/drivers/ChunkedStreamReader.js +168 -202
  40. package/dist/drivers/ChunkedStreamReader.js.map +1 -1
  41. package/dist/drivers/blob.cjs +15 -17
  42. package/dist/drivers/blob.cjs.map +1 -1
  43. package/dist/drivers/blob.d.ts +35 -35
  44. package/dist/drivers/blob.js +14 -15
  45. package/dist/drivers/blob.js.map +1 -1
  46. package/dist/drivers/index.cjs +18 -0
  47. package/dist/drivers/index.d.ts +29 -9
  48. package/dist/drivers/index.js +18 -0
  49. package/dist/drivers/interfaces.d.ts +17 -14
  50. package/dist/drivers/log.cjs +4 -3
  51. package/dist/drivers/log.cjs.map +1 -1
  52. package/dist/drivers/log.d.ts +52 -49
  53. package/dist/drivers/log.js +4 -2
  54. package/dist/drivers/log.js.map +1 -1
  55. package/dist/drivers/ls.cjs +16 -19
  56. package/dist/drivers/ls.cjs.map +1 -1
  57. package/dist/drivers/ls.d.ts +73 -76
  58. package/dist/drivers/ls.js +16 -17
  59. package/dist/drivers/ls.js.map +1 -1
  60. package/dist/drivers/pframe/column_filter.d.ts +19 -15
  61. package/dist/drivers/pframe/data_info.cjs +201 -252
  62. package/dist/drivers/pframe/data_info.cjs.map +1 -1
  63. package/dist/drivers/pframe/data_info.d.ts +84 -109
  64. package/dist/drivers/pframe/data_info.js +201 -250
  65. package/dist/drivers/pframe/data_info.js.map +1 -1
  66. package/dist/drivers/pframe/data_types.cjs +38 -63
  67. package/dist/drivers/pframe/data_types.cjs.map +1 -1
  68. package/dist/drivers/pframe/data_types.d.ts +91 -93
  69. package/dist/drivers/pframe/data_types.js +38 -61
  70. package/dist/drivers/pframe/data_types.js.map +1 -1
  71. package/dist/drivers/pframe/driver.cjs +7 -0
  72. package/dist/drivers/pframe/driver.cjs.map +1 -0
  73. package/dist/drivers/pframe/driver.d.ts +50 -45
  74. package/dist/drivers/pframe/driver.js +6 -0
  75. package/dist/drivers/pframe/driver.js.map +1 -0
  76. package/dist/drivers/pframe/filter_spec.d.ts +127 -123
  77. package/dist/drivers/pframe/find_columns.d.ts +21 -17
  78. package/dist/drivers/pframe/index.cjs +15 -0
  79. package/dist/drivers/pframe/index.d.ts +23 -16
  80. package/dist/drivers/pframe/index.js +15 -0
  81. package/dist/drivers/pframe/linker_columns.cjs +184 -238
  82. package/dist/drivers/pframe/linker_columns.cjs.map +1 -1
  83. package/dist/drivers/pframe/linker_columns.d.ts +45 -38
  84. package/dist/drivers/pframe/linker_columns.js +184 -236
  85. package/dist/drivers/pframe/linker_columns.js.map +1 -1
  86. package/dist/drivers/pframe/pframe.d.ts +26 -21
  87. package/dist/drivers/pframe/query/index.cjs +1 -0
  88. package/dist/drivers/pframe/query/index.d.ts +3 -4
  89. package/dist/drivers/pframe/query/index.js +1 -0
  90. package/dist/drivers/pframe/query/query_common.d.ts +205 -247
  91. package/dist/drivers/pframe/query/query_data.d.ts +25 -23
  92. package/dist/drivers/pframe/query/query_spec.d.ts +30 -29
  93. package/dist/drivers/pframe/query/utils.cjs +164 -183
  94. package/dist/drivers/pframe/query/utils.cjs.map +1 -1
  95. package/dist/drivers/pframe/query/utils.d.ts +13 -12
  96. package/dist/drivers/pframe/query/utils.js +164 -181
  97. package/dist/drivers/pframe/query/utils.js.map +1 -1
  98. package/dist/drivers/pframe/spec/anchored.cjs +178 -216
  99. package/dist/drivers/pframe/spec/anchored.cjs.map +1 -1
  100. package/dist/drivers/pframe/spec/anchored.d.ts +53 -49
  101. package/dist/drivers/pframe/spec/anchored.js +176 -214
  102. package/dist/drivers/pframe/spec/anchored.js.map +1 -1
  103. package/dist/drivers/pframe/spec/filtered_column.cjs +8 -7
  104. package/dist/drivers/pframe/spec/filtered_column.cjs.map +1 -1
  105. package/dist/drivers/pframe/spec/filtered_column.d.ts +20 -17
  106. package/dist/drivers/pframe/spec/filtered_column.js +8 -6
  107. package/dist/drivers/pframe/spec/filtered_column.js.map +1 -1
  108. package/dist/drivers/pframe/spec/ids.cjs +16 -14
  109. package/dist/drivers/pframe/spec/ids.cjs.map +1 -1
  110. package/dist/drivers/pframe/spec/ids.d.ts +13 -8
  111. package/dist/drivers/pframe/spec/ids.js +14 -12
  112. package/dist/drivers/pframe/spec/ids.js.map +1 -1
  113. package/dist/drivers/pframe/spec/index.cjs +6 -0
  114. package/dist/drivers/pframe/spec/index.d.ts +6 -7
  115. package/dist/drivers/pframe/spec/index.js +6 -0
  116. package/dist/drivers/pframe/spec/native_id.cjs +16 -16
  117. package/dist/drivers/pframe/spec/native_id.cjs.map +1 -1
  118. package/dist/drivers/pframe/spec/native_id.d.ts +9 -4
  119. package/dist/drivers/pframe/spec/native_id.js +13 -13
  120. package/dist/drivers/pframe/spec/native_id.js.map +1 -1
  121. package/dist/drivers/pframe/spec/selectors.cjs +72 -112
  122. package/dist/drivers/pframe/spec/selectors.cjs.map +1 -1
  123. package/dist/drivers/pframe/spec/selectors.d.ts +99 -94
  124. package/dist/drivers/pframe/spec/selectors.js +72 -110
  125. package/dist/drivers/pframe/spec/selectors.js.map +1 -1
  126. package/dist/drivers/pframe/spec/spec.cjs +282 -324
  127. package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
  128. package/dist/drivers/pframe/spec/spec.d.ts +263 -272
  129. package/dist/drivers/pframe/spec/spec.js +281 -322
  130. package/dist/drivers/pframe/spec/spec.js.map +1 -1
  131. package/dist/drivers/pframe/table.d.ts +28 -24
  132. package/dist/drivers/pframe/table_calculate.cjs +117 -147
  133. package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
  134. package/dist/drivers/pframe/table_calculate.d.ts +219 -220
  135. package/dist/drivers/pframe/table_calculate.js +117 -145
  136. package/dist/drivers/pframe/table_calculate.js.map +1 -1
  137. package/dist/drivers/pframe/table_common.cjs +13 -14
  138. package/dist/drivers/pframe/table_common.cjs.map +1 -1
  139. package/dist/drivers/pframe/table_common.d.ts +24 -19
  140. package/dist/drivers/pframe/table_common.js +13 -13
  141. package/dist/drivers/pframe/table_common.js.map +1 -1
  142. package/dist/drivers/pframe/unique_values.d.ts +23 -18
  143. package/dist/drivers/upload.d.ts +21 -18
  144. package/dist/drivers/urls.cjs +5 -6
  145. package/dist/drivers/urls.cjs.map +1 -1
  146. package/dist/drivers/urls.d.ts +12 -9
  147. package/dist/drivers/urls.js +5 -5
  148. package/dist/drivers/urls.js.map +1 -1
  149. package/dist/errors.cjs +65 -86
  150. package/dist/errors.cjs.map +1 -1
  151. package/dist/errors.d.ts +36 -33
  152. package/dist/errors.js +65 -85
  153. package/dist/errors.js.map +1 -1
  154. package/dist/flags/block_flags.cjs +7 -6
  155. package/dist/flags/block_flags.cjs.map +1 -1
  156. package/dist/flags/block_flags.d.ts +12 -8
  157. package/dist/flags/block_flags.js +7 -5
  158. package/dist/flags/block_flags.js.map +1 -1
  159. package/dist/flags/flag_utils.cjs +69 -108
  160. package/dist/flags/flag_utils.cjs.map +1 -1
  161. package/dist/flags/flag_utils.d.ts +40 -42
  162. package/dist/flags/flag_utils.js +70 -107
  163. package/dist/flags/flag_utils.js.map +1 -1
  164. package/dist/flags/type_utils.d.ts +12 -11
  165. package/dist/httpAuth.cjs +16 -20
  166. package/dist/httpAuth.cjs.map +1 -1
  167. package/dist/httpAuth.d.ts +10 -7
  168. package/dist/httpAuth.js +16 -19
  169. package/dist/httpAuth.js.map +1 -1
  170. package/dist/index.cjs +176 -179
  171. package/dist/index.d.ts +58 -20
  172. package/dist/index.js +37 -34
  173. package/dist/json.cjs +10 -8
  174. package/dist/json.cjs.map +1 -1
  175. package/dist/json.d.ts +18 -18
  176. package/dist/json.js +8 -6
  177. package/dist/json.js.map +1 -1
  178. package/dist/navigation.cjs +3 -2
  179. package/dist/navigation.cjs.map +1 -1
  180. package/dist/navigation.d.ts +18 -21
  181. package/dist/navigation.js +3 -1
  182. package/dist/navigation.js.map +1 -1
  183. package/dist/plid.cjs +16 -20
  184. package/dist/plid.cjs.map +1 -1
  185. package/dist/plid.d.ts +11 -7
  186. package/dist/plid.js +15 -18
  187. package/dist/plid.js.map +1 -1
  188. package/dist/pool/entry.d.ts +11 -11
  189. package/dist/pool/index.d.ts +3 -4
  190. package/dist/pool/query.cjs +21 -43
  191. package/dist/pool/query.cjs.map +1 -1
  192. package/dist/pool/query.d.ts +25 -20
  193. package/dist/pool/query.js +20 -40
  194. package/dist/pool/query.js.map +1 -1
  195. package/dist/pool/spec.cjs +40 -47
  196. package/dist/pool/spec.cjs.map +1 -1
  197. package/dist/pool/spec.d.ts +33 -31
  198. package/dist/pool/spec.js +40 -45
  199. package/dist/pool/spec.js.map +1 -1
  200. package/dist/ref.cjs +51 -71
  201. package/dist/ref.cjs.map +1 -1
  202. package/dist/ref.d.ts +36 -33
  203. package/dist/ref.js +50 -69
  204. package/dist/ref.js.map +1 -1
  205. package/dist/utag.d.ts +18 -14
  206. package/dist/util.cjs +8 -7
  207. package/dist/util.cjs.map +1 -1
  208. package/dist/util.d.ts +5 -2
  209. package/dist/util.js +8 -6
  210. package/dist/util.js.map +1 -1
  211. package/dist/value_or_error.cjs +7 -3
  212. package/dist/value_or_error.cjs.map +1 -1
  213. package/dist/value_or_error.d.ts +9 -6
  214. package/dist/value_or_error.js +7 -2
  215. package/dist/value_or_error.js.map +1 -1
  216. package/package.json +6 -6
  217. package/src/flags/block_flags.ts +2 -1
  218. package/src/flags/flag_utils.ts +0 -22
  219. package/dist/author_marker.d.ts.map +0 -1
  220. package/dist/base32_encode.d.ts +0 -8
  221. package/dist/base32_encode.d.ts.map +0 -1
  222. package/dist/base64.d.ts.map +0 -1
  223. package/dist/block_state.d.ts.map +0 -1
  224. package/dist/bmodel/block_config.d.ts.map +0 -1
  225. package/dist/bmodel/code.d.ts.map +0 -1
  226. package/dist/bmodel/container.d.ts.map +0 -1
  227. package/dist/bmodel/index.d.ts.map +0 -1
  228. package/dist/bmodel/normalization.d.ts.map +0 -1
  229. package/dist/bmodel/types.d.ts.map +0 -1
  230. package/dist/branding.d.ts.map +0 -1
  231. package/dist/common_types.d.ts.map +0 -1
  232. package/dist/driver_kit.d.ts.map +0 -1
  233. package/dist/drivers/ChunkedStreamReader.d.ts.map +0 -1
  234. package/dist/drivers/blob.d.ts.map +0 -1
  235. package/dist/drivers/index.d.ts.map +0 -1
  236. package/dist/drivers/interfaces.d.ts.map +0 -1
  237. package/dist/drivers/log.d.ts.map +0 -1
  238. package/dist/drivers/ls.d.ts.map +0 -1
  239. package/dist/drivers/pframe/column_filter.d.ts.map +0 -1
  240. package/dist/drivers/pframe/data_info.d.ts.map +0 -1
  241. package/dist/drivers/pframe/data_types.d.ts.map +0 -1
  242. package/dist/drivers/pframe/driver.d.ts.map +0 -1
  243. package/dist/drivers/pframe/filter_spec.d.ts.map +0 -1
  244. package/dist/drivers/pframe/find_columns.d.ts.map +0 -1
  245. package/dist/drivers/pframe/index.d.ts.map +0 -1
  246. package/dist/drivers/pframe/linker_columns.d.ts.map +0 -1
  247. package/dist/drivers/pframe/pframe.d.ts.map +0 -1
  248. package/dist/drivers/pframe/query/index.d.ts.map +0 -1
  249. package/dist/drivers/pframe/query/query_common.d.ts.map +0 -1
  250. package/dist/drivers/pframe/query/query_data.d.ts.map +0 -1
  251. package/dist/drivers/pframe/query/query_spec.d.ts.map +0 -1
  252. package/dist/drivers/pframe/query/utils.d.ts.map +0 -1
  253. package/dist/drivers/pframe/spec/anchored.d.ts.map +0 -1
  254. package/dist/drivers/pframe/spec/filtered_column.d.ts.map +0 -1
  255. package/dist/drivers/pframe/spec/ids.d.ts.map +0 -1
  256. package/dist/drivers/pframe/spec/index.d.ts.map +0 -1
  257. package/dist/drivers/pframe/spec/native_id.d.ts.map +0 -1
  258. package/dist/drivers/pframe/spec/selectors.d.ts.map +0 -1
  259. package/dist/drivers/pframe/spec/spec.d.ts.map +0 -1
  260. package/dist/drivers/pframe/table.d.ts.map +0 -1
  261. package/dist/drivers/pframe/table_calculate.d.ts.map +0 -1
  262. package/dist/drivers/pframe/table_common.d.ts.map +0 -1
  263. package/dist/drivers/pframe/type_util.d.ts +0 -5
  264. package/dist/drivers/pframe/type_util.d.ts.map +0 -1
  265. package/dist/drivers/pframe/unique_values.d.ts.map +0 -1
  266. package/dist/drivers/upload.d.ts.map +0 -1
  267. package/dist/drivers/urls.d.ts.map +0 -1
  268. package/dist/errors.d.ts.map +0 -1
  269. package/dist/flags/block_flags.d.ts.map +0 -1
  270. package/dist/flags/flag_utils.d.ts.map +0 -1
  271. package/dist/flags/index.d.ts +0 -4
  272. package/dist/flags/index.d.ts.map +0 -1
  273. package/dist/flags/type_utils.d.ts.map +0 -1
  274. package/dist/httpAuth.d.ts.map +0 -1
  275. package/dist/index.cjs.map +0 -1
  276. package/dist/index.d.ts.map +0 -1
  277. package/dist/index.js.map +0 -1
  278. package/dist/json.d.ts.map +0 -1
  279. package/dist/navigation.d.ts.map +0 -1
  280. package/dist/plid.d.ts.map +0 -1
  281. package/dist/pool/entry.d.ts.map +0 -1
  282. package/dist/pool/index.d.ts.map +0 -1
  283. package/dist/pool/query.d.ts.map +0 -1
  284. package/dist/pool/spec.d.ts.map +0 -1
  285. package/dist/ref.d.ts.map +0 -1
  286. package/dist/utag.d.ts.map +0 -1
  287. package/dist/util.d.ts.map +0 -1
  288. package/dist/value_or_error.d.ts.map +0 -1
@@ -1,241 +1,187 @@
1
- 'use strict';
1
+ const require_json = require('../../json.cjs');
2
+ const require_spec = require('./spec/spec.cjs');
2
3
 
3
- var json = require('../../json.cjs');
4
- var spec = require('./spec/spec.cjs');
5
-
6
- class LinkerMap {
7
- /** Graph of linkers connected by axes (single or grouped by parents) */
8
- data;
9
- constructor(linkerMap) {
10
- this.data = linkerMap;
11
- }
12
- get keys() {
13
- return this.data.keys();
14
- }
15
- get keyAxesIds() {
16
- return [...this.data.keys()].map(json.parseJson);
17
- }
18
- static fromColumns(columns) {
19
- const result = new Map();
20
- for (const linker of columns.filter((l) => !!spec.readAnnotationJson(l.spec, spec.Annotation.IsLinkerColumn))) {
21
- const groups = LinkerMap.getAxesGroups(spec.getNormalizedAxesList(linker.spec.axesSpec)); // split input axes into groups by parent links from annotation
22
- if (groups.length !== 2) {
23
- continue; // not a valid linker column
24
- }
25
- const [left, right] = groups;
26
- // In case of group:
27
- // A - C
28
- // \_ B _ D
29
- // E/
30
- // put 2 variants as keys:
31
- // A - C
32
- // \_ B _ D
33
- // and
34
- // E - B - D
35
- const leftKeyVariants = LinkerMap.getAxesRoots(left).map((axis) => {
36
- const axes = spec.getArrayFromAxisTree(spec.getAxesTree(axis));
37
- const key = json.canonicalizeJson(axes.map(spec.getAxisId));
38
- return [key, axes];
39
- });
40
- const rightKeyVariants = LinkerMap.getAxesRoots(right).map((axis) => {
41
- const axes = spec.getArrayFromAxisTree(spec.getAxesTree(axis));
42
- const key = json.canonicalizeJson(axes.map(spec.getAxisId));
43
- return [key, axes];
44
- });
45
- for (const [keyLeft, spec] of leftKeyVariants) {
46
- if (!result.has(keyLeft)) {
47
- result.set(keyLeft, { keyAxesSpec: spec, linkWith: new Map() });
48
- }
49
- }
50
- for (const [keyRight, spec] of rightKeyVariants) {
51
- if (!result.has(keyRight)) {
52
- result.set(keyRight, { keyAxesSpec: spec, linkWith: new Map() });
53
- }
54
- }
55
- for (const [keyLeft] of leftKeyVariants) {
56
- for (const [keyRight] of rightKeyVariants) {
57
- result.get(keyLeft)?.linkWith.set(keyRight, linker);
58
- result.get(keyRight)?.linkWith.set(keyLeft, linker);
59
- }
60
- }
61
- }
62
- return new this(result);
63
- }
64
- /** Get all available nodes of linker graphs if start from sourceAxesKeys */
65
- searchAvailableAxesKeys(sourceAxesKeys) {
66
- const startKeys = new Set(sourceAxesKeys);
67
- const allAvailableKeys = new Set();
68
- let nextKeys = sourceAxesKeys;
69
- while (nextKeys.length) {
70
- const next = [];
71
- for (const key of nextKeys) {
72
- const node = this.data.get(key);
73
- if (!node)
74
- continue;
75
- for (const availableKey of node.linkWith.keys()) {
76
- if (!allAvailableKeys.has(availableKey) && !startKeys.has(availableKey)) {
77
- next.push(availableKey);
78
- allAvailableKeys.add(availableKey);
79
- }
80
- }
81
- }
82
- nextKeys = next;
83
- }
84
- return allAvailableKeys;
85
- }
86
- /** Get all linker columns that are necessary to reach endKey from startKey */
87
- searchLinkerPath(startKey, endKey) {
88
- const previous = {};
89
- let nextIds = new Set([startKey]);
90
- const visited = new Set([startKey]);
91
- while (nextIds.size) {
92
- const next = new Set();
93
- for (const nextId of nextIds) {
94
- const node = this.data.get(nextId);
95
- if (!node)
96
- continue;
97
- for (const availableId of node.linkWith.keys()) {
98
- previous[availableId] = nextId;
99
- if (availableId === endKey) {
100
- const ids = [];
101
- let current = endKey;
102
- while (previous[current] !== startKey) {
103
- ids.push(current);
104
- current = previous[current];
105
- }
106
- ids.push(current);
107
- return ids.map((id) => this.data.get(id).linkWith.get(previous[id]));
108
- }
109
- else if (!visited.has(availableId)) {
110
- next.add(availableId);
111
- visited.add(availableId);
112
- }
113
- }
114
- }
115
- nextIds = next;
116
- }
117
- return [];
118
- }
119
- getLinkerColumnsForAxes({ from: sourceAxes, to: targetAxes, throwWhenNoLinkExists = true, }) {
120
- // start keys - all possible keys in linker map using sourceAxes (for example, all axes of block's columns or all axes of columns in data-inputs)
121
- const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
122
- return Array.from(new Map(LinkerMap.getAxesRoots(targetAxes)
123
- .map(LinkerMap.getLinkerKeyFromAxisSpec) // target keys contain all axes to be linked; if some of target axes has parents they must be in the key
124
- .flatMap((targetKey) => {
125
- const linkers = startKeys
126
- .map((startKey) => this.searchLinkerPath(startKey, targetKey))
127
- .reduce((shortestPath, path) => (shortestPath.length && shortestPath.length < path.length) || !path.length
128
- ? shortestPath
129
- : path, [])
130
- .map((linker) => [linker.columnId, linker]);
131
- if (!linkers.length && throwWhenNoLinkExists) {
132
- throw Error(`Unable to find linker column for ${targetKey}`);
133
- }
134
- return linkers;
135
- })).values());
136
- }
137
- /** Get list of axisSpecs from keys of linker columns map */
138
- getAxesListFromKeysList(keys) {
139
- return Array.from(new Map(keys
140
- .flatMap((key) => this.data.get(key)?.keyAxesSpec ?? [])
141
- .map((axis) => [json.canonicalizeJson(spec.getAxisId(axis)), axis])).values());
142
- }
143
- /** Get axes of target axes that are impossible to be linked to source axes with current linker map */
144
- getNonLinkableAxes(sourceAxes, targetAxes) {
145
- const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
146
- // target keys contain all axes to be linked; if some of target axes has parents they must be in the key
147
- const targetKeys = targetAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
148
- const axes = Array.from(new Map(targetAxes
149
- .filter((_targetAxis, idx) => {
150
- const targetKey = targetKeys[idx];
151
- return !startKeys.some((startKey) => this.searchLinkerPath(startKey, targetKey).length);
152
- })
153
- .flatMap((axis) => spec.getArrayFromAxisTree(spec.getAxesTree(axis)).map((axis) => [
154
- json.canonicalizeJson(spec.getAxisId(axis)),
155
- axis,
156
- ]))).values());
157
- return axes;
158
- }
159
- /** Get all axes that can be connected to sourceAxes by linkers */
160
- getReachableByLinkersAxesFromAxesNormalized(sourceAxes, matchAxisIdFn) {
161
- let startKeys = [];
162
- if (matchAxisIdFn) {
163
- const sourceAxisIdsGrouped = sourceAxes.map((axis) => spec.getArrayFromAxisTree(spec.getAxesTree(axis)).map(spec.getAxisId));
164
- for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {
165
- const matched = this.keyAxesIds.find((keyIds) => keyIds.every((linkerKeyAxisId) => sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId))));
166
- if (matched) {
167
- startKeys.push(json.canonicalizeJson(matched));
168
- }
169
- }
170
- }
171
- else {
172
- startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
173
- }
174
- const availableKeys = this.searchAvailableAxesKeys(startKeys);
175
- return this.getAxesListFromKeysList([...availableKeys]);
176
- }
177
- getReachableByLinkersAxesFromAxes(sourceAxes, matchAxisIdFn) {
178
- return this.getReachableByLinkersAxesFromAxesNormalized(spec.getNormalizedAxesList(sourceAxes), matchAxisIdFn);
179
- }
180
- static getLinkerKeyFromAxisSpec(axis) {
181
- return json.canonicalizeJson(spec.getArrayFromAxisTree(spec.getAxesTree(axis)).map(spec.getAxisId));
182
- }
183
- /** Split array of axes into several arrays by parents: axes of one group are parents for each other.
184
- There are no order inside every group. */
185
- static getAxesGroups(axesSpec) {
186
- switch (axesSpec.length) {
187
- case 0:
188
- return [];
189
- case 1:
190
- return [[axesSpec[0]]];
191
- }
192
- const axisKeys = axesSpec.map((spec$1) => json.canonicalizeJson(spec.getAxisId(spec$1)));
193
- const axisParentsIdxs = axesSpec.map((spec$1) => new Set(spec$1.parentAxesSpec
194
- .map((spec$1) => json.canonicalizeJson(spec.getAxisId(spec$1)))
195
- .map((el) => {
196
- const idx = axisKeys.indexOf(el);
197
- if (idx === -1) {
198
- throw new Error(`malformed axesSpec: ${JSON.stringify(axesSpec)}, unable to locate parent ${el}`);
199
- }
200
- return idx;
201
- })));
202
- const allIdxs = [...axesSpec.keys()];
203
- const groups = []; // groups of axis indexes
204
- const usedIdxs = new Set();
205
- let nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));
206
- while (nextFreeEl !== undefined) {
207
- const currentGroup = [nextFreeEl];
208
- usedIdxs.add(nextFreeEl);
209
- let nextElsOfCurrentGroup = [nextFreeEl];
210
- while (nextElsOfCurrentGroup.length) {
211
- const next = new Set();
212
- for (const groupIdx of nextElsOfCurrentGroup) {
213
- const groupElementParents = axisParentsIdxs[groupIdx];
214
- allIdxs.forEach((idx) => {
215
- if (idx === groupIdx || usedIdxs.has(idx)) {
216
- return;
217
- }
218
- const parents = axisParentsIdxs[idx];
219
- if (parents.has(groupIdx) || groupElementParents.has(idx)) {
220
- currentGroup.push(idx);
221
- next.add(idx);
222
- usedIdxs.add(idx);
223
- }
224
- });
225
- }
226
- nextElsOfCurrentGroup = [...next];
227
- }
228
- groups.push([...currentGroup]);
229
- nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));
230
- }
231
- return groups.map((group) => group.map((idx) => axesSpec[idx]));
232
- }
233
- /** Get all axes that are not parents of any other axis */
234
- static getAxesRoots(axes) {
235
- const parentsSet = new Set(axes.flatMap((axis) => axis.parentAxesSpec).map((spec$1) => json.canonicalizeJson(spec.getAxisId(spec$1))));
236
- return axes.filter((axis) => !parentsSet.has(json.canonicalizeJson(spec.getAxisId(axis))));
237
- }
238
- }
4
+ //#region src/drivers/pframe/linker_columns.ts
5
+ var LinkerMap = class LinkerMap {
6
+ /** Graph of linkers connected by axes (single or grouped by parents) */
7
+ data;
8
+ constructor(linkerMap) {
9
+ this.data = linkerMap;
10
+ }
11
+ get keys() {
12
+ return this.data.keys();
13
+ }
14
+ get keyAxesIds() {
15
+ return [...this.data.keys()].map(require_json.parseJson);
16
+ }
17
+ static fromColumns(columns) {
18
+ const result = /* @__PURE__ */ new Map();
19
+ for (const linker of columns.filter((l) => !!require_spec.readAnnotationJson(l.spec, require_spec.Annotation.IsLinkerColumn))) {
20
+ const groups = LinkerMap.getAxesGroups(require_spec.getNormalizedAxesList(linker.spec.axesSpec));
21
+ if (groups.length !== 2) continue;
22
+ const [left, right] = groups;
23
+ const leftKeyVariants = LinkerMap.getAxesRoots(left).map((axis) => {
24
+ const axes = require_spec.getArrayFromAxisTree(require_spec.getAxesTree(axis));
25
+ return [require_json.canonicalizeJson(axes.map(require_spec.getAxisId)), axes];
26
+ });
27
+ const rightKeyVariants = LinkerMap.getAxesRoots(right).map((axis) => {
28
+ const axes = require_spec.getArrayFromAxisTree(require_spec.getAxesTree(axis));
29
+ return [require_json.canonicalizeJson(axes.map(require_spec.getAxisId)), axes];
30
+ });
31
+ for (const [keyLeft, spec] of leftKeyVariants) if (!result.has(keyLeft)) result.set(keyLeft, {
32
+ keyAxesSpec: spec,
33
+ linkWith: /* @__PURE__ */ new Map()
34
+ });
35
+ for (const [keyRight, spec] of rightKeyVariants) if (!result.has(keyRight)) result.set(keyRight, {
36
+ keyAxesSpec: spec,
37
+ linkWith: /* @__PURE__ */ new Map()
38
+ });
39
+ for (const [keyLeft] of leftKeyVariants) for (const [keyRight] of rightKeyVariants) {
40
+ result.get(keyLeft)?.linkWith.set(keyRight, linker);
41
+ result.get(keyRight)?.linkWith.set(keyLeft, linker);
42
+ }
43
+ }
44
+ return new this(result);
45
+ }
46
+ /** Get all available nodes of linker graphs if start from sourceAxesKeys */
47
+ searchAvailableAxesKeys(sourceAxesKeys) {
48
+ const startKeys = new Set(sourceAxesKeys);
49
+ const allAvailableKeys = /* @__PURE__ */ new Set();
50
+ let nextKeys = sourceAxesKeys;
51
+ while (nextKeys.length) {
52
+ const next = [];
53
+ for (const key of nextKeys) {
54
+ const node = this.data.get(key);
55
+ if (!node) continue;
56
+ for (const availableKey of node.linkWith.keys()) if (!allAvailableKeys.has(availableKey) && !startKeys.has(availableKey)) {
57
+ next.push(availableKey);
58
+ allAvailableKeys.add(availableKey);
59
+ }
60
+ }
61
+ nextKeys = next;
62
+ }
63
+ return allAvailableKeys;
64
+ }
65
+ /** Get all linker columns that are necessary to reach endKey from startKey */
66
+ searchLinkerPath(startKey, endKey) {
67
+ const previous = {};
68
+ let nextIds = new Set([startKey]);
69
+ const visited = new Set([startKey]);
70
+ while (nextIds.size) {
71
+ const next = /* @__PURE__ */ new Set();
72
+ for (const nextId of nextIds) {
73
+ const node = this.data.get(nextId);
74
+ if (!node) continue;
75
+ for (const availableId of node.linkWith.keys()) {
76
+ previous[availableId] = nextId;
77
+ if (availableId === endKey) {
78
+ const ids = [];
79
+ let current = endKey;
80
+ while (previous[current] !== startKey) {
81
+ ids.push(current);
82
+ current = previous[current];
83
+ }
84
+ ids.push(current);
85
+ return ids.map((id) => this.data.get(id).linkWith.get(previous[id]));
86
+ } else if (!visited.has(availableId)) {
87
+ next.add(availableId);
88
+ visited.add(availableId);
89
+ }
90
+ }
91
+ }
92
+ nextIds = next;
93
+ }
94
+ return [];
95
+ }
96
+ getLinkerColumnsForAxes({ from: sourceAxes, to: targetAxes, throwWhenNoLinkExists = true }) {
97
+ const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
98
+ return Array.from(new Map(LinkerMap.getAxesRoots(targetAxes).map(LinkerMap.getLinkerKeyFromAxisSpec).flatMap((targetKey) => {
99
+ const linkers = startKeys.map((startKey) => this.searchLinkerPath(startKey, targetKey)).reduce((shortestPath, path) => shortestPath.length && shortestPath.length < path.length || !path.length ? shortestPath : path, []).map((linker) => [linker.columnId, linker]);
100
+ if (!linkers.length && throwWhenNoLinkExists) throw Error(`Unable to find linker column for ${targetKey}`);
101
+ return linkers;
102
+ })).values());
103
+ }
104
+ /** Get list of axisSpecs from keys of linker columns map */
105
+ getAxesListFromKeysList(keys) {
106
+ return Array.from(new Map(keys.flatMap((key) => this.data.get(key)?.keyAxesSpec ?? []).map((axis) => [require_json.canonicalizeJson(require_spec.getAxisId(axis)), axis])).values());
107
+ }
108
+ /** Get axes of target axes that are impossible to be linked to source axes with current linker map */
109
+ getNonLinkableAxes(sourceAxes, targetAxes) {
110
+ const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
111
+ const targetKeys = targetAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
112
+ return Array.from(new Map(targetAxes.filter((_targetAxis, idx) => {
113
+ const targetKey = targetKeys[idx];
114
+ return !startKeys.some((startKey) => this.searchLinkerPath(startKey, targetKey).length);
115
+ }).flatMap((axis) => require_spec.getArrayFromAxisTree(require_spec.getAxesTree(axis)).map((axis) => [require_json.canonicalizeJson(require_spec.getAxisId(axis)), axis]))).values());
116
+ }
117
+ /** Get all axes that can be connected to sourceAxes by linkers */
118
+ getReachableByLinkersAxesFromAxesNormalized(sourceAxes, matchAxisIdFn) {
119
+ let startKeys = [];
120
+ if (matchAxisIdFn) {
121
+ const sourceAxisIdsGrouped = sourceAxes.map((axis) => require_spec.getArrayFromAxisTree(require_spec.getAxesTree(axis)).map(require_spec.getAxisId));
122
+ for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {
123
+ const matched = this.keyAxesIds.find((keyIds) => keyIds.every((linkerKeyAxisId) => sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId))));
124
+ if (matched) startKeys.push(require_json.canonicalizeJson(matched));
125
+ }
126
+ } else startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
127
+ const availableKeys = this.searchAvailableAxesKeys(startKeys);
128
+ return this.getAxesListFromKeysList([...availableKeys]);
129
+ }
130
+ getReachableByLinkersAxesFromAxes(sourceAxes, matchAxisIdFn) {
131
+ return this.getReachableByLinkersAxesFromAxesNormalized(require_spec.getNormalizedAxesList(sourceAxes), matchAxisIdFn);
132
+ }
133
+ static getLinkerKeyFromAxisSpec(axis) {
134
+ return require_json.canonicalizeJson(require_spec.getArrayFromAxisTree(require_spec.getAxesTree(axis)).map(require_spec.getAxisId));
135
+ }
136
+ /** Split array of axes into several arrays by parents: axes of one group are parents for each other.
137
+ There are no order inside every group. */
138
+ static getAxesGroups(axesSpec) {
139
+ switch (axesSpec.length) {
140
+ case 0: return [];
141
+ case 1: return [[axesSpec[0]]];
142
+ default: break;
143
+ }
144
+ const axisKeys = axesSpec.map((spec) => require_json.canonicalizeJson(require_spec.getAxisId(spec)));
145
+ const axisParentsIdxs = axesSpec.map((spec) => new Set(spec.parentAxesSpec.map((spec) => require_json.canonicalizeJson(require_spec.getAxisId(spec))).map((el) => {
146
+ const idx = axisKeys.indexOf(el);
147
+ if (idx === -1) throw new Error(`malformed axesSpec: ${JSON.stringify(axesSpec)}, unable to locate parent ${el}`);
148
+ return idx;
149
+ })));
150
+ const allIdxs = [...axesSpec.keys()];
151
+ const groups = [];
152
+ const usedIdxs = /* @__PURE__ */ new Set();
153
+ let nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));
154
+ while (nextFreeEl !== void 0) {
155
+ const currentGroup = [nextFreeEl];
156
+ usedIdxs.add(nextFreeEl);
157
+ let nextElsOfCurrentGroup = [nextFreeEl];
158
+ while (nextElsOfCurrentGroup.length) {
159
+ const next = /* @__PURE__ */ new Set();
160
+ for (const groupIdx of nextElsOfCurrentGroup) {
161
+ const groupElementParents = axisParentsIdxs[groupIdx];
162
+ allIdxs.forEach((idx) => {
163
+ if (idx === groupIdx || usedIdxs.has(idx)) return;
164
+ if (axisParentsIdxs[idx].has(groupIdx) || groupElementParents.has(idx)) {
165
+ currentGroup.push(idx);
166
+ next.add(idx);
167
+ usedIdxs.add(idx);
168
+ }
169
+ });
170
+ }
171
+ nextElsOfCurrentGroup = [...next];
172
+ }
173
+ groups.push([...currentGroup]);
174
+ nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));
175
+ }
176
+ return groups.map((group) => group.map((idx) => axesSpec[idx]));
177
+ }
178
+ /** Get all axes that are not parents of any other axis */
179
+ static getAxesRoots(axes) {
180
+ const parentsSet = new Set(axes.flatMap((axis) => axis.parentAxesSpec).map((spec) => require_json.canonicalizeJson(require_spec.getAxisId(spec))));
181
+ return axes.filter((axis) => !parentsSet.has(require_json.canonicalizeJson(require_spec.getAxisId(axis))));
182
+ }
183
+ };
239
184
 
185
+ //#endregion
240
186
  exports.LinkerMap = LinkerMap;
241
- //# sourceMappingURL=linker_columns.cjs.map
187
+ //# sourceMappingURL=linker_columns.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"linker_columns.cjs","sources":["../../../src/drivers/pframe/linker_columns.ts"],"sourcesContent":["import { canonicalizeJson, parseJson, type CanonicalizedJson } from \"../../json\";\nimport {\n Annotation,\n readAnnotationJson,\n type AxisSpec,\n type PColumnIdAndSpec,\n type AxisSpecNormalized,\n type AxisId,\n getAxisId,\n getNormalizedAxesList,\n getArrayFromAxisTree,\n getAxesTree,\n} from \"./spec/spec\";\n\ntype LinkerKey = CanonicalizedJson<AxisId[]>;\nexport type CompositeLinkerMap = Map<\n LinkerKey,\n {\n keyAxesSpec: AxisSpecNormalized[]; // axis specs - source for the key\n linkWith: Map<LinkerKey, PColumnIdAndSpec>; // for every axis (possibly in group with parents - available by linkers another axes and corresponding linkers)\n }\n>;\n\ninterface LinkersData {\n data: CompositeLinkerMap;\n}\nexport class LinkerMap implements LinkersData {\n /** Graph of linkers connected by axes (single or grouped by parents) */\n readonly data: CompositeLinkerMap;\n\n constructor(linkerMap: CompositeLinkerMap) {\n this.data = linkerMap;\n }\n\n get keys() {\n return this.data.keys();\n }\n\n get keyAxesIds() {\n return [...this.data.keys()].map(parseJson);\n }\n\n static fromColumns(columns: PColumnIdAndSpec[]) {\n const result: CompositeLinkerMap = new Map();\n for (const linker of columns.filter(\n (l) => !!readAnnotationJson(l.spec, Annotation.IsLinkerColumn),\n )) {\n const groups = LinkerMap.getAxesGroups(getNormalizedAxesList(linker.spec.axesSpec)); // split input axes into groups by parent links from annotation\n\n if (groups.length !== 2) {\n continue; // not a valid linker column\n }\n const [left, right] = groups;\n\n // In case of group:\n // A - C\n // \\_ B _ D\n // E/\n // put 2 variants as keys:\n // A - C\n // \\_ B _ D\n // and\n // E - B - D\n const leftKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(left).map(\n (axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n },\n );\n const rightKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(\n right,\n ).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n\n for (const [keyLeft, spec] of leftKeyVariants) {\n if (!result.has(keyLeft)) {\n result.set(keyLeft, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyRight, spec] of rightKeyVariants) {\n if (!result.has(keyRight)) {\n result.set(keyRight, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyLeft] of leftKeyVariants) {\n for (const [keyRight] of rightKeyVariants) {\n result.get(keyLeft)?.linkWith.set(keyRight, linker);\n result.get(keyRight)?.linkWith.set(keyLeft, linker);\n }\n }\n }\n return new this(result);\n }\n\n /** Get all available nodes of linker graphs if start from sourceAxesKeys */\n searchAvailableAxesKeys(sourceAxesKeys: LinkerKey[]): Set<LinkerKey> {\n const startKeys = new Set(sourceAxesKeys);\n const allAvailableKeys = new Set<LinkerKey>();\n let nextKeys = sourceAxesKeys;\n while (nextKeys.length) {\n const next: LinkerKey[] = [];\n for (const key of nextKeys) {\n const node = this.data.get(key);\n if (!node) continue;\n for (const availableKey of node.linkWith.keys()) {\n if (!allAvailableKeys.has(availableKey) && !startKeys.has(availableKey)) {\n next.push(availableKey);\n allAvailableKeys.add(availableKey);\n }\n }\n }\n nextKeys = next;\n }\n return allAvailableKeys;\n }\n\n /** Get all linker columns that are necessary to reach endKey from startKey */\n searchLinkerPath(startKey: LinkerKey, endKey: LinkerKey): PColumnIdAndSpec[] {\n const previous: Record<LinkerKey, LinkerKey> = {};\n let nextIds = new Set([startKey]);\n const visited = new Set([startKey]);\n while (nextIds.size) {\n const next = new Set<LinkerKey>();\n for (const nextId of nextIds) {\n const node = this.data.get(nextId);\n if (!node) continue;\n for (const availableId of node.linkWith.keys()) {\n previous[availableId] = nextId;\n if (availableId === endKey) {\n const ids: LinkerKey[] = [];\n let current = endKey;\n while (previous[current] !== startKey) {\n ids.push(current);\n current = previous[current];\n }\n ids.push(current);\n return ids.map((id: LinkerKey) => this.data.get(id)!.linkWith.get(previous[id])!);\n } else if (!visited.has(availableId)) {\n next.add(availableId);\n visited.add(availableId);\n }\n }\n }\n nextIds = next;\n }\n return [];\n }\n\n getLinkerColumnsForAxes({\n from: sourceAxes,\n to: targetAxes,\n throwWhenNoLinkExists = true,\n }: {\n from: AxisSpecNormalized[];\n to: AxisSpecNormalized[];\n throwWhenNoLinkExists?: boolean;\n }): PColumnIdAndSpec[] {\n // start keys - all possible keys in linker map using sourceAxes (for example, all axes of block's columns or all axes of columns in data-inputs)\n const startKeys: LinkerKey[] = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n return Array.from(\n new Map(\n LinkerMap.getAxesRoots(targetAxes)\n .map(LinkerMap.getLinkerKeyFromAxisSpec) // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n .flatMap((targetKey) => {\n const linkers = startKeys\n .map((startKey) => this.searchLinkerPath(startKey, targetKey))\n .reduce(\n (shortestPath, path) =>\n (shortestPath.length && shortestPath.length < path.length) || !path.length\n ? shortestPath\n : path,\n [] as PColumnIdAndSpec[],\n )\n .map((linker) => [linker.columnId, linker] as const);\n if (!linkers.length && throwWhenNoLinkExists) {\n throw Error(`Unable to find linker column for ${targetKey}`);\n }\n return linkers;\n }),\n ).values(),\n );\n }\n\n /** Get list of axisSpecs from keys of linker columns map */\n getAxesListFromKeysList(keys: LinkerKey[]): AxisSpecNormalized[] {\n return Array.from(\n new Map(\n keys\n .flatMap((key) => this.data.get(key)?.keyAxesSpec ?? [])\n .map((axis) => [canonicalizeJson(getAxisId(axis)), axis]),\n ).values(),\n );\n }\n\n /** Get axes of target axes that are impossible to be linked to source axes with current linker map */\n getNonLinkableAxes(\n sourceAxes: AxisSpecNormalized[],\n targetAxes: AxisSpecNormalized[],\n ): AxisSpecNormalized[] {\n const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n const targetKeys = targetAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n const axes = Array.from(\n new Map(\n targetAxes\n .filter((_targetAxis, idx) => {\n const targetKey = targetKeys[idx];\n return !startKeys.some((startKey) => this.searchLinkerPath(startKey, targetKey).length);\n })\n .flatMap((axis) =>\n getArrayFromAxisTree(getAxesTree(axis)).map((axis) => [\n canonicalizeJson(getAxisId(axis)),\n axis,\n ]),\n ),\n ).values(),\n );\n return axes;\n }\n\n /** Get all axes that can be connected to sourceAxes by linkers */\n getReachableByLinkersAxesFromAxesNormalized(\n sourceAxes: AxisSpecNormalized[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n let startKeys: CanonicalizedJson<AxisId[]>[] = [];\n\n if (matchAxisIdFn) {\n const sourceAxisIdsGrouped: AxisId[][] = sourceAxes.map((axis) =>\n getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId),\n );\n for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {\n const matched = this.keyAxesIds.find((keyIds: AxisId[]) =>\n keyIds.every((linkerKeyAxisId) =>\n sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId)),\n ),\n );\n if (matched) {\n startKeys.push(canonicalizeJson(matched));\n }\n }\n } else {\n startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n }\n\n const availableKeys = this.searchAvailableAxesKeys(startKeys);\n return this.getAxesListFromKeysList([...availableKeys]);\n }\n\n getReachableByLinkersAxesFromAxes(\n sourceAxes: AxisSpec[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n return this.getReachableByLinkersAxesFromAxesNormalized(\n getNormalizedAxesList(sourceAxes),\n matchAxisIdFn,\n );\n }\n\n static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey {\n return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n }\n\n /** Split array of axes into several arrays by parents: axes of one group are parents for each other.\n There are no order inside every group. */\n static getAxesGroups(axesSpec: AxisSpecNormalized[]): AxisSpecNormalized[][] {\n switch (axesSpec.length) {\n case 0:\n return [];\n case 1:\n return [[axesSpec[0]]];\n default:\n break;\n }\n\n const axisKeys = axesSpec.map((spec) => canonicalizeJson(getAxisId(spec)));\n const axisParentsIdxs = axesSpec.map(\n (spec) =>\n new Set(\n spec.parentAxesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)))\n .map((el) => {\n const idx = axisKeys.indexOf(el);\n if (idx === -1) {\n throw new Error(\n `malformed axesSpec: ${JSON.stringify(axesSpec)}, unable to locate parent ${el}`,\n );\n }\n return idx;\n }),\n ),\n );\n\n const allIdxs = [...axesSpec.keys()];\n const groups: number[][] = []; // groups of axis indexes\n\n const usedIdxs = new Set<number>();\n let nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n while (nextFreeEl !== undefined) {\n const currentGroup = [nextFreeEl];\n usedIdxs.add(nextFreeEl);\n\n let nextElsOfCurrentGroup = [nextFreeEl];\n while (nextElsOfCurrentGroup.length) {\n const next = new Set<number>();\n for (const groupIdx of nextElsOfCurrentGroup) {\n const groupElementParents = axisParentsIdxs[groupIdx];\n allIdxs.forEach((idx) => {\n if (idx === groupIdx || usedIdxs.has(idx)) {\n return;\n }\n const parents = axisParentsIdxs[idx];\n if (parents.has(groupIdx) || groupElementParents.has(idx)) {\n currentGroup.push(idx);\n next.add(idx);\n usedIdxs.add(idx);\n }\n });\n }\n nextElsOfCurrentGroup = [...next];\n }\n\n groups.push([...currentGroup]);\n nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n }\n\n return groups.map((group) => group.map((idx) => axesSpec[idx]));\n }\n\n /** Get all axes that are not parents of any other axis */\n static getAxesRoots(axes: AxisSpecNormalized[]): AxisSpecNormalized[] {\n const parentsSet = new Set(\n axes.flatMap((axis) => axis.parentAxesSpec).map((spec) => canonicalizeJson(getAxisId(spec))),\n );\n return axes.filter((axis) => !parentsSet.has(canonicalizeJson(getAxisId(axis))));\n }\n}\n"],"names":["parseJson","readAnnotationJson","Annotation","getNormalizedAxesList","getArrayFromAxisTree","getAxesTree","canonicalizeJson","getAxisId","spec"],"mappings":"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"}
1
+ {"version":3,"file":"linker_columns.cjs","names":["parseJson","readAnnotationJson","Annotation","getNormalizedAxesList","getArrayFromAxisTree","getAxesTree","canonicalizeJson","getAxisId"],"sources":["../../../src/drivers/pframe/linker_columns.ts"],"sourcesContent":["import { canonicalizeJson, parseJson, type CanonicalizedJson } from \"../../json\";\nimport {\n Annotation,\n readAnnotationJson,\n type AxisSpec,\n type PColumnIdAndSpec,\n type AxisSpecNormalized,\n type AxisId,\n getAxisId,\n getNormalizedAxesList,\n getArrayFromAxisTree,\n getAxesTree,\n} from \"./spec/spec\";\n\ntype LinkerKey = CanonicalizedJson<AxisId[]>;\nexport type CompositeLinkerMap = Map<\n LinkerKey,\n {\n keyAxesSpec: AxisSpecNormalized[]; // axis specs - source for the key\n linkWith: Map<LinkerKey, PColumnIdAndSpec>; // for every axis (possibly in group with parents - available by linkers another axes and corresponding linkers)\n }\n>;\n\ninterface LinkersData {\n data: CompositeLinkerMap;\n}\nexport class LinkerMap implements LinkersData {\n /** Graph of linkers connected by axes (single or grouped by parents) */\n readonly data: CompositeLinkerMap;\n\n constructor(linkerMap: CompositeLinkerMap) {\n this.data = linkerMap;\n }\n\n get keys() {\n return this.data.keys();\n }\n\n get keyAxesIds() {\n return [...this.data.keys()].map(parseJson);\n }\n\n static fromColumns(columns: PColumnIdAndSpec[]) {\n const result: CompositeLinkerMap = new Map();\n for (const linker of columns.filter(\n (l) => !!readAnnotationJson(l.spec, Annotation.IsLinkerColumn),\n )) {\n const groups = LinkerMap.getAxesGroups(getNormalizedAxesList(linker.spec.axesSpec)); // split input axes into groups by parent links from annotation\n\n if (groups.length !== 2) {\n continue; // not a valid linker column\n }\n const [left, right] = groups;\n\n // In case of group:\n // A - C\n // \\_ B _ D\n // E/\n // put 2 variants as keys:\n // A - C\n // \\_ B _ D\n // and\n // E - B - D\n const leftKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(left).map(\n (axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n },\n );\n const rightKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(\n right,\n ).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n\n for (const [keyLeft, spec] of leftKeyVariants) {\n if (!result.has(keyLeft)) {\n result.set(keyLeft, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyRight, spec] of rightKeyVariants) {\n if (!result.has(keyRight)) {\n result.set(keyRight, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyLeft] of leftKeyVariants) {\n for (const [keyRight] of rightKeyVariants) {\n result.get(keyLeft)?.linkWith.set(keyRight, linker);\n result.get(keyRight)?.linkWith.set(keyLeft, linker);\n }\n }\n }\n return new this(result);\n }\n\n /** Get all available nodes of linker graphs if start from sourceAxesKeys */\n searchAvailableAxesKeys(sourceAxesKeys: LinkerKey[]): Set<LinkerKey> {\n const startKeys = new Set(sourceAxesKeys);\n const allAvailableKeys = new Set<LinkerKey>();\n let nextKeys = sourceAxesKeys;\n while (nextKeys.length) {\n const next: LinkerKey[] = [];\n for (const key of nextKeys) {\n const node = this.data.get(key);\n if (!node) continue;\n for (const availableKey of node.linkWith.keys()) {\n if (!allAvailableKeys.has(availableKey) && !startKeys.has(availableKey)) {\n next.push(availableKey);\n allAvailableKeys.add(availableKey);\n }\n }\n }\n nextKeys = next;\n }\n return allAvailableKeys;\n }\n\n /** Get all linker columns that are necessary to reach endKey from startKey */\n searchLinkerPath(startKey: LinkerKey, endKey: LinkerKey): PColumnIdAndSpec[] {\n const previous: Record<LinkerKey, LinkerKey> = {};\n let nextIds = new Set([startKey]);\n const visited = new Set([startKey]);\n while (nextIds.size) {\n const next = new Set<LinkerKey>();\n for (const nextId of nextIds) {\n const node = this.data.get(nextId);\n if (!node) continue;\n for (const availableId of node.linkWith.keys()) {\n previous[availableId] = nextId;\n if (availableId === endKey) {\n const ids: LinkerKey[] = [];\n let current = endKey;\n while (previous[current] !== startKey) {\n ids.push(current);\n current = previous[current];\n }\n ids.push(current);\n return ids.map((id: LinkerKey) => this.data.get(id)!.linkWith.get(previous[id])!);\n } else if (!visited.has(availableId)) {\n next.add(availableId);\n visited.add(availableId);\n }\n }\n }\n nextIds = next;\n }\n return [];\n }\n\n getLinkerColumnsForAxes({\n from: sourceAxes,\n to: targetAxes,\n throwWhenNoLinkExists = true,\n }: {\n from: AxisSpecNormalized[];\n to: AxisSpecNormalized[];\n throwWhenNoLinkExists?: boolean;\n }): PColumnIdAndSpec[] {\n // start keys - all possible keys in linker map using sourceAxes (for example, all axes of block's columns or all axes of columns in data-inputs)\n const startKeys: LinkerKey[] = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n return Array.from(\n new Map(\n LinkerMap.getAxesRoots(targetAxes)\n .map(LinkerMap.getLinkerKeyFromAxisSpec) // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n .flatMap((targetKey) => {\n const linkers = startKeys\n .map((startKey) => this.searchLinkerPath(startKey, targetKey))\n .reduce(\n (shortestPath, path) =>\n (shortestPath.length && shortestPath.length < path.length) || !path.length\n ? shortestPath\n : path,\n [] as PColumnIdAndSpec[],\n )\n .map((linker) => [linker.columnId, linker] as const);\n if (!linkers.length && throwWhenNoLinkExists) {\n throw Error(`Unable to find linker column for ${targetKey}`);\n }\n return linkers;\n }),\n ).values(),\n );\n }\n\n /** Get list of axisSpecs from keys of linker columns map */\n getAxesListFromKeysList(keys: LinkerKey[]): AxisSpecNormalized[] {\n return Array.from(\n new Map(\n keys\n .flatMap((key) => this.data.get(key)?.keyAxesSpec ?? [])\n .map((axis) => [canonicalizeJson(getAxisId(axis)), axis]),\n ).values(),\n );\n }\n\n /** Get axes of target axes that are impossible to be linked to source axes with current linker map */\n getNonLinkableAxes(\n sourceAxes: AxisSpecNormalized[],\n targetAxes: AxisSpecNormalized[],\n ): AxisSpecNormalized[] {\n const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n const targetKeys = targetAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n const axes = Array.from(\n new Map(\n targetAxes\n .filter((_targetAxis, idx) => {\n const targetKey = targetKeys[idx];\n return !startKeys.some((startKey) => this.searchLinkerPath(startKey, targetKey).length);\n })\n .flatMap((axis) =>\n getArrayFromAxisTree(getAxesTree(axis)).map((axis) => [\n canonicalizeJson(getAxisId(axis)),\n axis,\n ]),\n ),\n ).values(),\n );\n return axes;\n }\n\n /** Get all axes that can be connected to sourceAxes by linkers */\n getReachableByLinkersAxesFromAxesNormalized(\n sourceAxes: AxisSpecNormalized[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n let startKeys: CanonicalizedJson<AxisId[]>[] = [];\n\n if (matchAxisIdFn) {\n const sourceAxisIdsGrouped: AxisId[][] = sourceAxes.map((axis) =>\n getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId),\n );\n for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {\n const matched = this.keyAxesIds.find((keyIds: AxisId[]) =>\n keyIds.every((linkerKeyAxisId) =>\n sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId)),\n ),\n );\n if (matched) {\n startKeys.push(canonicalizeJson(matched));\n }\n }\n } else {\n startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n }\n\n const availableKeys = this.searchAvailableAxesKeys(startKeys);\n return this.getAxesListFromKeysList([...availableKeys]);\n }\n\n getReachableByLinkersAxesFromAxes(\n sourceAxes: AxisSpec[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n return this.getReachableByLinkersAxesFromAxesNormalized(\n getNormalizedAxesList(sourceAxes),\n matchAxisIdFn,\n );\n }\n\n static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey {\n return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n }\n\n /** Split array of axes into several arrays by parents: axes of one group are parents for each other.\n There are no order inside every group. */\n static getAxesGroups(axesSpec: AxisSpecNormalized[]): AxisSpecNormalized[][] {\n switch (axesSpec.length) {\n case 0:\n return [];\n case 1:\n return [[axesSpec[0]]];\n default:\n break;\n }\n\n const axisKeys = axesSpec.map((spec) => canonicalizeJson(getAxisId(spec)));\n const axisParentsIdxs = axesSpec.map(\n (spec) =>\n new Set(\n spec.parentAxesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)))\n .map((el) => {\n const idx = axisKeys.indexOf(el);\n if (idx === -1) {\n throw new Error(\n `malformed axesSpec: ${JSON.stringify(axesSpec)}, unable to locate parent ${el}`,\n );\n }\n return idx;\n }),\n ),\n );\n\n const allIdxs = [...axesSpec.keys()];\n const groups: number[][] = []; // groups of axis indexes\n\n const usedIdxs = new Set<number>();\n let nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n while (nextFreeEl !== undefined) {\n const currentGroup = [nextFreeEl];\n usedIdxs.add(nextFreeEl);\n\n let nextElsOfCurrentGroup = [nextFreeEl];\n while (nextElsOfCurrentGroup.length) {\n const next = new Set<number>();\n for (const groupIdx of nextElsOfCurrentGroup) {\n const groupElementParents = axisParentsIdxs[groupIdx];\n allIdxs.forEach((idx) => {\n if (idx === groupIdx || usedIdxs.has(idx)) {\n return;\n }\n const parents = axisParentsIdxs[idx];\n if (parents.has(groupIdx) || groupElementParents.has(idx)) {\n currentGroup.push(idx);\n next.add(idx);\n usedIdxs.add(idx);\n }\n });\n }\n nextElsOfCurrentGroup = [...next];\n }\n\n groups.push([...currentGroup]);\n nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n }\n\n return groups.map((group) => group.map((idx) => axesSpec[idx]));\n }\n\n /** Get all axes that are not parents of any other axis */\n static getAxesRoots(axes: AxisSpecNormalized[]): AxisSpecNormalized[] {\n const parentsSet = new Set(\n axes.flatMap((axis) => axis.parentAxesSpec).map((spec) => canonicalizeJson(getAxisId(spec))),\n );\n return axes.filter((axis) => !parentsSet.has(canonicalizeJson(getAxisId(axis))));\n }\n}\n"],"mappings":"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"}
@@ -1,44 +1,51 @@
1
- import { type CanonicalizedJson } from "../../json";
2
- import { type AxisSpec, type PColumnIdAndSpec, type AxisSpecNormalized, type AxisId } from "./spec/spec";
1
+ import { CanonicalizedJson } from "../../json.js";
2
+ import { AxisId, AxisSpec, AxisSpecNormalized, PColumnIdAndSpec } from "./spec/spec.js";
3
+
4
+ //#region src/drivers/pframe/linker_columns.d.ts
3
5
  type LinkerKey = CanonicalizedJson<AxisId[]>;
4
- export type CompositeLinkerMap = Map<LinkerKey, {
5
- keyAxesSpec: AxisSpecNormalized[];
6
- linkWith: Map<LinkerKey, PColumnIdAndSpec>;
6
+ type CompositeLinkerMap = Map<LinkerKey, {
7
+ keyAxesSpec: AxisSpecNormalized[];
8
+ linkWith: Map<LinkerKey, PColumnIdAndSpec>;
7
9
  }>;
8
10
  interface LinkersData {
9
- data: CompositeLinkerMap;
11
+ data: CompositeLinkerMap;
10
12
  }
11
- export declare class LinkerMap implements LinkersData {
12
- /** Graph of linkers connected by axes (single or grouped by parents) */
13
- readonly data: CompositeLinkerMap;
14
- constructor(linkerMap: CompositeLinkerMap);
15
- get keys(): MapIterator<string & {
16
- __json_canonicalized: AxisId[];
17
- }>;
18
- get keyAxesIds(): AxisId[][];
19
- static fromColumns(columns: PColumnIdAndSpec[]): LinkerMap;
20
- /** Get all available nodes of linker graphs if start from sourceAxesKeys */
21
- searchAvailableAxesKeys(sourceAxesKeys: LinkerKey[]): Set<LinkerKey>;
22
- /** Get all linker columns that are necessary to reach endKey from startKey */
23
- searchLinkerPath(startKey: LinkerKey, endKey: LinkerKey): PColumnIdAndSpec[];
24
- getLinkerColumnsForAxes({ from: sourceAxes, to: targetAxes, throwWhenNoLinkExists, }: {
25
- from: AxisSpecNormalized[];
26
- to: AxisSpecNormalized[];
27
- throwWhenNoLinkExists?: boolean;
28
- }): PColumnIdAndSpec[];
29
- /** Get list of axisSpecs from keys of linker columns map */
30
- getAxesListFromKeysList(keys: LinkerKey[]): AxisSpecNormalized[];
31
- /** Get axes of target axes that are impossible to be linked to source axes with current linker map */
32
- getNonLinkableAxes(sourceAxes: AxisSpecNormalized[], targetAxes: AxisSpecNormalized[]): AxisSpecNormalized[];
33
- /** Get all axes that can be connected to sourceAxes by linkers */
34
- getReachableByLinkersAxesFromAxesNormalized(sourceAxes: AxisSpecNormalized[], matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean): AxisSpecNormalized[];
35
- getReachableByLinkersAxesFromAxes(sourceAxes: AxisSpec[], matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean): AxisSpecNormalized[];
36
- static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey;
37
- /** Split array of axes into several arrays by parents: axes of one group are parents for each other.
38
- There are no order inside every group. */
39
- static getAxesGroups(axesSpec: AxisSpecNormalized[]): AxisSpecNormalized[][];
40
- /** Get all axes that are not parents of any other axis */
41
- static getAxesRoots(axes: AxisSpecNormalized[]): AxisSpecNormalized[];
13
+ declare class LinkerMap implements LinkersData {
14
+ /** Graph of linkers connected by axes (single or grouped by parents) */
15
+ readonly data: CompositeLinkerMap;
16
+ constructor(linkerMap: CompositeLinkerMap);
17
+ get keys(): MapIterator<string & {
18
+ __json_canonicalized: AxisId[];
19
+ }>;
20
+ get keyAxesIds(): AxisId[][];
21
+ static fromColumns(columns: PColumnIdAndSpec[]): LinkerMap;
22
+ /** Get all available nodes of linker graphs if start from sourceAxesKeys */
23
+ searchAvailableAxesKeys(sourceAxesKeys: LinkerKey[]): Set<LinkerKey>;
24
+ /** Get all linker columns that are necessary to reach endKey from startKey */
25
+ searchLinkerPath(startKey: LinkerKey, endKey: LinkerKey): PColumnIdAndSpec[];
26
+ getLinkerColumnsForAxes({
27
+ from: sourceAxes,
28
+ to: targetAxes,
29
+ throwWhenNoLinkExists
30
+ }: {
31
+ from: AxisSpecNormalized[];
32
+ to: AxisSpecNormalized[];
33
+ throwWhenNoLinkExists?: boolean;
34
+ }): PColumnIdAndSpec[];
35
+ /** Get list of axisSpecs from keys of linker columns map */
36
+ getAxesListFromKeysList(keys: LinkerKey[]): AxisSpecNormalized[];
37
+ /** Get axes of target axes that are impossible to be linked to source axes with current linker map */
38
+ getNonLinkableAxes(sourceAxes: AxisSpecNormalized[], targetAxes: AxisSpecNormalized[]): AxisSpecNormalized[];
39
+ /** Get all axes that can be connected to sourceAxes by linkers */
40
+ getReachableByLinkersAxesFromAxesNormalized(sourceAxes: AxisSpecNormalized[], matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean): AxisSpecNormalized[];
41
+ getReachableByLinkersAxesFromAxes(sourceAxes: AxisSpec[], matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean): AxisSpecNormalized[];
42
+ static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey;
43
+ /** Split array of axes into several arrays by parents: axes of one group are parents for each other.
44
+ There are no order inside every group. */
45
+ static getAxesGroups(axesSpec: AxisSpecNormalized[]): AxisSpecNormalized[][];
46
+ /** Get all axes that are not parents of any other axis */
47
+ static getAxesRoots(axes: AxisSpecNormalized[]): AxisSpecNormalized[];
42
48
  }
43
- export {};
49
+ //#endregion
50
+ export { CompositeLinkerMap, LinkerMap };
44
51
  //# sourceMappingURL=linker_columns.d.ts.map