@grnsft/if 0.0.5 → 0.1.0

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 (146) hide show
  1. package/.examples/ompls/azure.yml +205 -0
  2. package/.github/workflows/nodejs-ci.yml +0 -8
  3. package/README.md +48 -9
  4. package/build/config/config.d.ts +0 -23
  5. package/build/config/config.js +1 -24
  6. package/build/index.js +3 -4
  7. package/build/lib/models-universe.js +95 -0
  8. package/build/lib/observatory.js +31 -0
  9. package/build/lib/supercomputer.js +109 -0
  10. package/examples/impls/test/azure.yml +8 -8
  11. package/examples/impls/test/ccf.yml +5 -3
  12. package/examples/impls/test/if-demo.yml +19 -9
  13. package/examples/impls/test/metadata.yml +3 -2
  14. package/examples/impls/test/nesting.yml +10 -13
  15. package/examples/impls/test/sci-e.yml +1 -1
  16. package/examples/impls/test/sci-m.yml +2 -2
  17. package/examples/impls/test/sci-o.yml +2 -4
  18. package/examples/impls/test/sci.yml +1 -2
  19. package/examples/impls/test/shell.yml +2 -1
  20. package/examples/impls/{tdp-finder-test.yml → test/tdp-finder.yml} +8 -8
  21. package/examples/ompls/ccf.yml +3 -1
  22. package/examples/ompls/if-demo.yml +46 -22
  23. package/package.json +12 -5
  24. package/tsconfig.build.json +7 -0
  25. package/tsconfig.build.tsbuildinfo +1 -0
  26. package/build/__mocks__/azure/index.d.ts +0 -11
  27. package/build/__mocks__/azure/index.js +0 -132
  28. package/build/__mocks__/boavizta/countries.json +0 -138
  29. package/build/__mocks__/boavizta/instance_types.json +0 -625
  30. package/build/__mocks__/boavizta/providers.json +0 -1
  31. package/build/__mocks__/fs/index.d.ts +0 -3
  32. package/build/__mocks__/fs/index.js +0 -56
  33. package/build/__mocks__/model-universe/index.d.ts +0 -31
  34. package/build/__mocks__/model-universe/index.js +0 -64
  35. package/build/__mocks__/watt-time/data.json +0 -119
  36. package/build/__tests__/integration/ompl/index.test.d.ts +0 -1
  37. package/build/__tests__/integration/ompl/index.test.js +0 -61
  38. package/build/__tests__/unit/lib/azure-importer/index.test.d.ts +0 -1
  39. package/build/__tests__/unit/lib/azure-importer/index.test.js +0 -152
  40. package/build/__tests__/unit/lib/boavizta/index.test.d.ts +0 -1
  41. package/build/__tests__/unit/lib/boavizta/index.test.js +0 -579
  42. package/build/__tests__/unit/lib/case-studies/aveva.test.d.ts +0 -1
  43. package/build/__tests__/unit/lib/case-studies/aveva.test.js +0 -36
  44. package/build/__tests__/unit/lib/case-studies/emem.test.d.ts +0 -1
  45. package/build/__tests__/unit/lib/case-studies/emem.test.js +0 -108
  46. package/build/__tests__/unit/lib/case-studies/eshoppen.test.d.ts +0 -1
  47. package/build/__tests__/unit/lib/case-studies/eshoppen.test.js +0 -53
  48. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.d.ts +0 -1
  49. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.js +0 -23
  50. package/build/__tests__/unit/lib/ccf/index.test.d.ts +0 -1
  51. package/build/__tests__/unit/lib/ccf/index.test.js +0 -223
  52. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.d.ts +0 -1
  53. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.js +0 -73
  54. package/build/__tests__/unit/lib/sci/index.test.d.ts +0 -1
  55. package/build/__tests__/unit/lib/sci/index.test.js +0 -106
  56. package/build/__tests__/unit/lib/sci-e/index.test.d.ts +0 -1
  57. package/build/__tests__/unit/lib/sci-e/index.test.js +0 -30
  58. package/build/__tests__/unit/lib/sci-m/index.test.d.ts +0 -1
  59. package/build/__tests__/unit/lib/sci-m/index.test.js +0 -58
  60. package/build/__tests__/unit/lib/sci-o/index.test.d.ts +0 -1
  61. package/build/__tests__/unit/lib/sci-o/index.test.js +0 -42
  62. package/build/__tests__/unit/lib/shell-imp/index.test.d.ts +0 -1
  63. package/build/__tests__/unit/lib/shell-imp/index.test.js +0 -21
  64. package/build/__tests__/unit/lib/tdp-finder/index.test.d.ts +0 -1
  65. package/build/__tests__/unit/lib/tdp-finder/index.test.js +0 -62
  66. package/build/__tests__/unit/lib/teads-aws/index.test.d.ts +0 -1
  67. package/build/__tests__/unit/lib/teads-aws/index.test.js +0 -170
  68. package/build/__tests__/unit/lib/teads-curve/index.test.d.ts +0 -1
  69. package/build/__tests__/unit/lib/teads-curve/index.test.js +0 -146
  70. package/build/__tests__/unit/lib/watt-time/index.test.d.ts +0 -1
  71. package/build/__tests__/unit/lib/watt-time/index.test.js +0 -106
  72. package/build/__tests__/unit/util/args.test.d.ts +0 -1
  73. package/build/__tests__/unit/util/args.test.js +0 -92
  74. package/build/__tests__/unit/util/models-universe.test.d.ts +0 -1
  75. package/build/__tests__/unit/util/models-universe.test.js +0 -193
  76. package/build/__tests__/unit/util/observatory.test.d.ts +0 -1
  77. package/build/__tests__/unit/util/observatory.test.js +0 -99
  78. package/build/__tests__/unit/util/supercomputer.test.d.ts +0 -1
  79. package/build/__tests__/unit/util/supercomputer.test.js +0 -231
  80. package/build/__tests__/unit/util/yaml.test.d.ts +0 -1
  81. package/build/__tests__/unit/util/yaml.test.js +0 -59
  82. package/build/lib/azure-importer/index.d.ts +0 -55
  83. package/build/lib/azure-importer/index.js +0 -314
  84. package/build/lib/boavizta/index.d.ts +0 -53
  85. package/build/lib/boavizta/index.js +0 -254
  86. package/build/lib/case-studies/aveva-model.d.ts +0 -29
  87. package/build/lib/case-studies/aveva-model.js +0 -53
  88. package/build/lib/case-studies/emem-model.d.ts +0 -42
  89. package/build/lib/case-studies/emem-model.js +0 -93
  90. package/build/lib/case-studies/eshoppen-model.d.ts +0 -24
  91. package/build/lib/case-studies/eshoppen-model.js +0 -123
  92. package/build/lib/case-studies/index.d.ts +0 -4
  93. package/build/lib/case-studies/index.js +0 -21
  94. package/build/lib/case-studies/sci-accenture-model.d.ts +0 -10
  95. package/build/lib/case-studies/sci-accenture-model.js +0 -37
  96. package/build/lib/ccf/aws-embodied.json +0 -5591
  97. package/build/lib/ccf/aws-instances.json +0 -21116
  98. package/build/lib/ccf/aws-use.json +0 -79
  99. package/build/lib/ccf/azure-embodied.json +0 -6547
  100. package/build/lib/ccf/azure-instances.json +0 -8332
  101. package/build/lib/ccf/azure-use.json +0 -58
  102. package/build/lib/ccf/gcp-embodied.json +0 -3049
  103. package/build/lib/ccf/gcp-instances.json +0 -3880
  104. package/build/lib/ccf/gcp-use.json +0 -58
  105. package/build/lib/ccf/index.d.ts +0 -63
  106. package/build/lib/ccf/index.js +0 -338
  107. package/build/lib/cloud-instance-metadata/aws-instances.json +0 -1
  108. package/build/lib/cloud-instance-metadata/azure-instances.json +0 -1
  109. package/build/lib/cloud-instance-metadata/index.d.ts +0 -15
  110. package/build/lib/cloud-instance-metadata/index.js +0 -104
  111. package/build/lib/index.d.ts +0 -14
  112. package/build/lib/index.js +0 -32
  113. package/build/lib/interfaces/ccf.d.ts +0 -19
  114. package/build/lib/interfaces/ccf.js +0 -3
  115. package/build/lib/interfaces/index.d.ts +0 -7
  116. package/build/lib/interfaces/index.js +0 -18
  117. package/build/lib/sci/index.d.ts +0 -13
  118. package/build/lib/sci/index.js +0 -131
  119. package/build/lib/sci-e/index.d.ts +0 -38
  120. package/build/lib/sci-e/index.js +0 -85
  121. package/build/lib/sci-m/index.d.ts +0 -10
  122. package/build/lib/sci-m/index.js +0 -124
  123. package/build/lib/sci-o/index.d.ts +0 -17
  124. package/build/lib/sci-o/index.js +0 -52
  125. package/build/lib/shell-imp/index.d.ts +0 -32
  126. package/build/lib/shell-imp/index.js +0 -82
  127. package/build/lib/tdp-finder/index.d.ts +0 -19
  128. package/build/lib/tdp-finder/index.js +0 -98
  129. package/build/lib/teads-aws/aws-embodied.json +0 -1
  130. package/build/lib/teads-aws/aws-instances.json +0 -1
  131. package/build/lib/teads-aws/index.d.ts +0 -58
  132. package/build/lib/teads-aws/index.js +0 -208
  133. package/build/lib/teads-curve/index.d.ts +0 -52
  134. package/build/lib/teads-curve/index.js +0 -158
  135. package/build/lib/watt-time/index.d.ts +0 -18
  136. package/build/lib/watt-time/index.js +0 -204
  137. package/build/util/models-universe.js +0 -95
  138. package/build/util/observatory.js +0 -31
  139. package/build/util/supercomputer.js +0 -109
  140. package/docs/implementations/tdp-finder.md +0 -36
  141. package/examples/impls/test/complex-pipeline.yml +0 -67
  142. package/examples/impls/test/toto.yaml +0 -22
  143. package/tsconfig.tsbuildinfo +0 -1
  144. /package/build/{util → lib}/models-universe.d.ts +0 -0
  145. /package/build/{util → lib}/observatory.d.ts +0 -0
  146. /package/build/{util → lib}/supercomputer.d.ts +0 -0
@@ -1,204 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WattTimeGridEmissions = void 0;
4
- const axios_1 = require("axios");
5
- const dayjs = require("dayjs");
6
- const config_1 = require("../../config");
7
- const { MODEL_IDS } = config_1.CONFIG;
8
- const { WATT_TIME } = MODEL_IDS;
9
- class WattTimeGridEmissions {
10
- constructor() {
11
- this.authParams = undefined;
12
- this.token = '';
13
- this.baseUrl = 'https://api2.watttime.org/v2';
14
- }
15
- async authenticate(authParams) {
16
- this.token = 'token' in authParams ? authParams['token'] : '';
17
- if (this.token.startsWith('ENV_')) {
18
- this.token = process.env[this.token.slice(4)] ?? '';
19
- }
20
- if (this.token === '') {
21
- // Extracting username and password from authParams
22
- let username = 'username' in authParams ? authParams['username'] : '';
23
- let password = 'password' in authParams ? authParams['password'] : '';
24
- // if username or password is ENV_<env_var_name>, then extract the value from the environment variable
25
- if (username.startsWith('ENV_')) {
26
- username = process.env[username.slice(4)] ?? '';
27
- }
28
- if (password.startsWith('ENV_')) {
29
- password = process.env[password.slice(4)] ?? '';
30
- }
31
- // WattTime API requires username and password / token
32
- if (username === '' || password === '') {
33
- throw new Error('Missing username or password & token');
34
- }
35
- // Login to WattTime API to get a token
36
- const tokenResponse = await axios_1.default.get(`${this.baseUrl}/login`, {
37
- auth: {
38
- username,
39
- password,
40
- },
41
- });
42
- if (tokenResponse === undefined ||
43
- tokenResponse.data === undefined ||
44
- !('token' in tokenResponse.data)) {
45
- throw new Error('Missing token in response. Invalid credentials provided.');
46
- }
47
- this.token = tokenResponse.data.token;
48
- }
49
- }
50
- async execute(inputs) {
51
- if (!Array.isArray(inputs)) {
52
- throw new Error('inputs should be an array');
53
- }
54
- // validate inputs for location data + timestamp + duration
55
- this.validateinputs(inputs);
56
- // determine the earliest start and total duration of all input blocks
57
- const { startTime, fetchDuration } = this.determineinputStartEnd(inputs);
58
- // fetch data from WattTime API for the entire duration
59
- const wattimedata = await this.fetchData({
60
- timestamp: startTime.format(),
61
- duration: fetchDuration,
62
- ...inputs[0],
63
- });
64
- // for each input block, calculate the average emission
65
- inputs.map((input) => {
66
- const inputStart = dayjs(input.timestamp);
67
- const inputEnd = inputStart.add(input.duration, 'seconds');
68
- const { datapoints, data } = this.getWattTimeDataForDuration(wattimedata, inputStart, inputEnd);
69
- const emissionSum = data.reduce((a, b) => a + b, 0);
70
- if (datapoints === 0) {
71
- throw new Error('Did not receive data from WattTime API for the input block.');
72
- }
73
- input['grid-carbon-intensity'] = emissionSum / datapoints;
74
- });
75
- return inputs;
76
- }
77
- getWattTimeDataForDuration(wattimedata, inputStart, inputEnd) {
78
- let datapoints = 0;
79
- const data = wattimedata.map((data) => {
80
- // WattTime API returns full data for the entire duration.
81
- // if the data point is before the input start, ignore it
82
- if (dayjs(data.point_time).isBefore(inputStart)) {
83
- return 0;
84
- }
85
- // if the data point is after the input end, ignore it.
86
- // if the data point is exactly the same as the input end, ignore it
87
- if (dayjs(data.point_time).isAfter(inputEnd) ||
88
- dayjs(data.point_time).format() === dayjs(inputEnd).format()) {
89
- return 0;
90
- }
91
- // lbs/MWh to Kg/MWh by dividing by 0.453592 (0.453592 Kg/lbs)
92
- // (Kg/MWh == g/kWh)
93
- // convert to kg/KWh by dividing by 1000. (1MWh = 1000KWh)
94
- // convert to g/KWh by multiplying by 1000. (1Kg = 1000g)
95
- // hence each other cancel out and g/KWh is the same as kg/MWh
96
- const grid_emission = data.value / 0.45359237;
97
- datapoints += 1;
98
- return grid_emission;
99
- });
100
- return { datapoints, data };
101
- }
102
- validateinputs(inputs) {
103
- inputs.forEach((input) => {
104
- if (!('location' in input)) {
105
- const { latitude, longitude } = this.getLatitudeLongitudeFrominput(input);
106
- if (isNaN(latitude) || isNaN(longitude)) {
107
- throw new Error('latitude or longitude is not a number');
108
- }
109
- }
110
- if (!('timestamp' in input)) {
111
- throw new Error('timestamp is missing');
112
- }
113
- if (!('duration' in input)) {
114
- throw new Error('duration is missing');
115
- }
116
- });
117
- }
118
- getLatitudeLongitudeFrominput(input) {
119
- const location = input['location'].split(','); //split location into latitude and longitude
120
- if (location.length !== 2) {
121
- throw new Error('location should be a comma separated string of latitude and longitude');
122
- }
123
- if (location[0] === '' || location[1] === '') {
124
- throw new Error('latitude or longitude is missing');
125
- }
126
- if (location[0] === '0' || location[1] === '0') {
127
- throw new Error('latitude or longitude is missing');
128
- }
129
- const latitude = parseFloat(location[0]); //convert latitude to float
130
- const longitude = parseFloat(location[1]); //convert longitude to float
131
- return { latitude, longitude };
132
- }
133
- determineinputStartEnd(inputs) {
134
- // largest possible start time
135
- let starttime = dayjs('9999-12-31');
136
- // smallest possible end time
137
- let endtime = dayjs('1970-01-01');
138
- inputs.forEach((input) => {
139
- const duration = input.duration;
140
- // if the input timestamp is before the current starttime, set it as the new starttime
141
- starttime = dayjs(input.timestamp).isBefore(starttime)
142
- ? dayjs(input.timestamp)
143
- : starttime;
144
- // if the input timestamp + duration is after the current endtime, set it as the new endtime
145
- endtime = dayjs(input.timestamp).add(duration, 'seconds').isAfter(endtime)
146
- ? dayjs(input.timestamp).add(duration, 'seconds')
147
- : endtime;
148
- });
149
- const fetchDuration = endtime.diff(starttime, 'seconds');
150
- if (fetchDuration > 32 * 24 * 60 * 60) {
151
- throw new Error('duration is too long.WattTime API only supports up to 32 days. All inputs must be within 32 days of each other. Duration of ' +
152
- fetchDuration +
153
- ' seconds is too long.');
154
- }
155
- return { startTime: starttime, fetchDuration };
156
- }
157
- async fetchData(input) {
158
- const duration = input.duration;
159
- // WattTime API only supports up to 32 days
160
- if (duration > 32 * 24 * 60 * 60) {
161
- throw new Error('duration is too long');
162
- }
163
- const { latitude, longitude } = this.getLatitudeLongitudeFrominput(input);
164
- const params = {
165
- latitude: latitude,
166
- longitude: longitude,
167
- starttime: dayjs(input.timestamp).format('YYYY-MM-DDTHH:mm:ssZ'),
168
- endtime: dayjs(input.timestamp).add(duration, 'seconds'),
169
- };
170
- const result = await axios_1.default
171
- .get(`${this.baseUrl}/data`, {
172
- params,
173
- headers: {
174
- Authorization: `Bearer ${this.token}`,
175
- },
176
- })
177
- .catch(e => {
178
- throw new Error('Error fetching data from WattTime API.' + e);
179
- });
180
- if (result.status !== 200) {
181
- throw new Error('Error fetching data from WattTime API.' + result.status);
182
- }
183
- if (!('data' in result) || !Array.isArray(result.data)) {
184
- throw new Error('Invalid response from WattTime API.');
185
- }
186
- return result.data.sort((a, b) => {
187
- return dayjs(a.point_time).unix() > dayjs(b.point_time).unix() ? 1 : -1;
188
- });
189
- }
190
- async configure(name, staticParams) {
191
- this.staticParams = staticParams;
192
- this.name = name;
193
- if (!staticParams) {
194
- throw new Error('Missing staticParams');
195
- }
196
- await this.authenticate(staticParams);
197
- return this;
198
- }
199
- modelIdentifier() {
200
- return WATT_TIME;
201
- }
202
- }
203
- exports.WattTimeGridEmissions = WattTimeGridEmissions;
204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3dhdHQtdGltZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBMEI7QUFDMUIsK0JBQStCO0FBSS9CLHlDQUFvQztBQUlwQyxNQUFNLEVBQUMsU0FBUyxFQUFDLEdBQUcsZUFBTSxDQUFDO0FBQzNCLE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxTQUFTLENBQUM7QUFFOUIsTUFBYSxxQkFBcUI7SUFBbEM7UUFDRSxlQUFVLEdBQXVCLFNBQVMsQ0FBQztRQUMzQyxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBR1gsWUFBTyxHQUFHLDhCQUE4QixDQUFDO0lBc08zQyxDQUFDO0lBcE9DLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBa0I7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBRSxVQUFVLENBQUMsT0FBTyxDQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNyRDtRQUNELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUU7WUFDckIsbURBQW1EO1lBQ25ELElBQUksUUFBUSxHQUNWLFVBQVUsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFFLFVBQVUsQ0FBQyxVQUFVLENBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JFLElBQUksUUFBUSxHQUNWLFVBQVUsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFFLFVBQVUsQ0FBQyxVQUFVLENBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxD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QUN6QixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMzRTtRQUNELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztTQUN4RDtRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsQ0FBTSxFQUFFLEVBQUU7WUFDekMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FDYixJQUFZLEVBQ1osWUFBZ0M7UUFFaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7U0FDekM7UUFDRCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQTNPRCxzREEyT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0ICogYXMgZGF5anMgZnJvbSAnZGF5anMnO1xuXG5pbXBvcnQge0lPdXRwdXRNb2RlbEludGVyZmFjZX0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7Q09ORklHfSBmcm9tICcuLi8uLi9jb25maWcnO1xuXG5pbXBvcnQge0tleVZhbHVlUGFpcn0gZnJvbSAnLi4vLi4vdHlwZXMvY29tbW9uJztcblxuY29uc3Qge01PREVMX0lEU30gPSBDT05GSUc7XG5jb25zdCB7V0FUVF9USU1FfSA9IE1PREVMX0lEUztcblxuZXhwb3J0IGNsYXNzIFdhdHRUaW1lR3JpZEVtaXNzaW9ucyBpbXBsZW1lbnRzIElPdXRwdXRNb2RlbEludGVyZmFjZSB7XG4gIGF1dGhQYXJhbXM6IG9iamVjdCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgdG9rZW4gPSAnJztcbiAgc3RhdGljUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQ7XG4gIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgYmFzZVVybCA9ICdodHRwczovL2FwaTIud2F0dHRpbWUub3JnL3YyJztcblxuICBhc3luYyBhdXRoZW50aWNhdGUoYXV0aFBhcmFtczogb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy50b2tlbiA9ICd0b2tlbicgaW4gYXV0aFBhcmFtcyA/IChhdXRoUGFyYW1zWyd0b2tlbiddIGFzIHN0cmluZykgOiAnJztcbiAgICBpZiAodGhpcy50b2tlbi5zdGFydHNXaXRoKCdFTlZfJykpIHtcbiAgICAgIHRoaXMudG9rZW4gPSBwcm9jZXNzLmVudlt0aGlzLnRva2VuLnNsaWNlKDQpXSA/PyAnJztcbiAgICB9XG4gICAgaWYgKHRoaXMudG9rZW4gPT09ICcnKSB7XG4gICAgICAvLyBFeHRyYWN0aW5nIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmcm9tIGF1dGhQYXJhbXNcbiAgICAgIGxldCB1c2VybmFtZSA9XG4gICAgICAgICd1c2VybmFtZScgaW4gYXV0aFBhcmFtcyA/IChhdXRoUGFyYW1zWyd1c2VybmFtZSddIGFzIHN0cmluZykgOiAnJztcbiAgICAgIGxldCBwYXNzd29yZCA9XG4gICAgICAgICdwYXNzd29yZCcgaW4gYXV0aFBhcmFtcyA/IChhdXRoUGFyYW1zWydwYXNzd29yZCddIGFzIHN0cmluZykgOiAnJztcblxuICAgICAgLy8gaWYgdXNlcm5hbWUgb3IgcGFzc3dvcmQgaXMgRU5WXzxlbnZfdmFyX25hbWU+LCB0aGVuIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAgICBpZiAodXNlcm5hbWUuc3RhcnRzV2l0aCgnRU5WXycpKSB7XG4gICAgICAgIHVzZXJuYW1lID0gcHJvY2Vzcy5lbnZbdXNlcm5hbWUuc2xpY2UoNCldID8/ICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFzc3dvcmQuc3RhcnRzV2l0aCgnRU5WXycpKSB7XG4gICAgICAgIHBhc3N3b3JkID0gcHJvY2Vzcy5lbnZbcGFzc3dvcmQuc2xpY2UoNCldID8/ICcnO1xuICAgICAgfVxuXG4gICAgICAvLyAgV2F0dFRpbWUgQVBJIHJlcXVpcmVzIHVzZXJuYW1lIGFuZCBwYXNzd29yZCAvIHRva2VuXG4gICAgICBpZiAodXNlcm5hbWUgPT09ICcnIHx8IHBhc3N3b3JkID09PSAnJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdXNlcm5hbWUgb3IgcGFzc3dvcmQgJiB0b2tlbicpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2dpbiB0byBXYXR0VGltZSBBUEkgdG8gZ2V0IGEgdG9rZW5cbiAgICAgIGNvbnN0IHRva2VuUmVzcG9uc2UgPSBhd2FpdCBheGlvcy5nZXQoYCR7dGhpcy5iYXNlVXJsfS9sb2dpbmAsIHtcbiAgICAgICAgYXV0aDoge1xuICAgICAgICAgIHVzZXJuYW1lLFxuICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAoXG4gICAgICAgIHRva2VuUmVzcG9uc2UgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICB0b2tlblJlc3BvbnNlLmRhdGEgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAhKCd0b2tlbicgaW4gdG9rZW5SZXNwb25zZS5kYXRhKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnTWlzc2luZyB0b2tlbiBpbiByZXNwb25zZS4gSW52YWxpZCBjcmVkZW50aWFscyBwcm92aWRlZC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnRva2VuID0gdG9rZW5SZXNwb25zZS5kYXRhLnRva2VuO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoaW5wdXRzOiBvYmplY3QgfCBvYmplY3RbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnB1dHMgc2hvdWxkIGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIC8vIHZhbGlkYXRlIGlucHV0cyBmb3IgbG9jYXRpb24gZGF0YSArIHRpbWVzdGFtcCArIGR1cmF0aW9uXG4gICAgdGhpcy52YWxpZGF0ZWlucHV0cyhpbnB1dHMpO1xuICAgIC8vIGRldGVybWluZSB0aGUgZWFybGllc3Qgc3RhcnQgYW5kIHRvdGFsIGR1cmF0aW9uIG9mIGFsbCBpbnB1dCBibG9ja3NcbiAgICBjb25zdCB7c3RhcnRUaW1lLCBmZXRjaER1cmF0aW9ufSA9IHRoaXMuZGV0ZXJtaW5laW5wdXRTdGFydEVuZChpbnB1dHMpO1xuICAgIC8vIGZldGNoIGRhdGEgZnJvbSBXYXR0VGltZSBBUEkgZm9yIHRoZSBlbnRpcmUgZHVyYXRpb25cbiAgICBjb25zdCB3YXR0aW1lZGF0YSA9IGF3YWl0IHRoaXMuZmV0Y2hEYXRhKHtcbiAgICAgIHRpbWVzdGFtcDogc3RhcnRUaW1lLmZvcm1hdCgpLFxuICAgICAgZHVyYXRpb246IGZldGNoRHVyYXRpb24sXG4gICAgICAuLi5pbnB1dHNbMF0sXG4gICAgfSk7XG4gICAgLy8gZm9yIGVhY2ggaW5wdXQgYmxvY2ssIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSBlbWlzc2lvblxuICAgIGlucHV0cy5tYXAoKGlucHV0OiBLZXlWYWx1ZVBhaXIpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0U3RhcnQgPSBkYXlqcyhpbnB1dC50aW1lc3RhbXApO1xuICAgICAgY29uc3QgaW5wdXRFbmQgPSBpbnB1dFN0YXJ0LmFkZChpbnB1dC5kdXJhdGlvbiwgJ3NlY29uZHMnKTtcbiAgICAgIGNvbnN0IHtkYXRhcG9pbnRzLCBkYXRhfSA9IHRoaXMuZ2V0V2F0dFRpbWVEYXRhRm9yRHVyYXRpb24oXG4gICAgICAgIHdhdHRpbWVkYXRhLFxuICAgICAgICBpbnB1dFN0YXJ0LFxuICAgICAgICBpbnB1dEVuZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGVtaXNzaW9uU3VtID0gZGF0YS5yZWR1Y2UoKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBhICsgYiwgMCk7XG4gICAgICBpZiAoZGF0YXBvaW50cyA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0RpZCBub3QgcmVjZWl2ZSBkYXRhIGZyb20gV2F0dFRpbWUgQVBJIGZvciB0aGUgaW5wdXQgYmxvY2suJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaW5wdXRbJ2dyaWQtY2FyYm9uLWludGVuc2l0eSddID0gZW1pc3Npb25TdW0gLyBkYXRhcG9pbnRzO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V2F0dFRpbWVEYXRhRm9yRHVyYXRpb24oXG4gICAgd2F0dGltZWRhdGE6IEtleVZhbHVlUGFpcltdLFxuICAgIGlucHV0U3RhcnQ6IGRheWpzLkRheWpzLFxuICAgIGlucHV0RW5kOiBkYXlqcy5EYXlqc1xuICApOiB7ZGF0YXBvaW50czogbnVtYmVyOyBkYXRhOiBudW1iZXJbXX0ge1xuICAgIGxldCBkYXRhcG9pbnRzID0gMDtcbiAgICBjb25zdCBkYXRhID0gd2F0dGltZWRhdGEubWFwKChkYXRhOiBLZXlWYWx1ZVBhaXIpID0+IHtcbiAgICAgIC8vIFdhdHRUaW1lIEFQSSByZXR1cm5zIGZ1bGwgZGF0YSBmb3IgdGhlIGVudGlyZSBkdXJhdGlvbi5cbiAgICAgIC8vIGlmIHRoZSBkYXRhIHBvaW50IGlzIGJlZm9yZSB0aGUgaW5wdXQgc3RhcnQsIGlnbm9yZSBpdFxuICAgICAgaWYgKGRheWpzKGRhdGEucG9pbnRfdGltZSkuaXNCZWZvcmUoaW5wdXRTdGFydCkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICAvLyBpZiB0aGUgZGF0YSBwb2ludCBpcyBhZnRlciB0aGUgaW5wdXQgZW5kLCBpZ25vcmUgaXQuXG4gICAgICAvLyBpZiB0aGUgZGF0YSBwb2ludCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBpbnB1dCBlbmQsIGlnbm9yZSBpdFxuICAgICAgaWYgKFxuICAgICAgICBkYXlqcyhkYXRhLnBvaW50X3RpbWUpLmlzQWZ0ZXIoaW5wdXRFbmQpIHx8XG4gICAgICAgIGRheWpzKGRhdGEucG9pbnRfdGltZSkuZm9ybWF0KCkgPT09IGRheWpzKGlucHV0RW5kKS5mb3JtYXQoKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgLy8gbGJzL01XaCB0byBLZy9NV2ggYnkgZGl2aWRpbmcgYnkgMC40NTM1OTIgKDAuNDUzNTkyIEtnL2xicylcbiAgICAgIC8vIChLZy9NV2ggPT0gZy9rV2gpXG4gICAgICAvLyBjb252ZXJ0IHRvIGtnL0tXaCBieSBkaXZpZGluZyBieSAxMDAwLiAoMU1XaCA9IDEwMDBLV2gpXG4gICAgICAvLyBjb252ZXJ0IHRvIGcvS1doIGJ5IG11bHRpcGx5aW5nIGJ5IDEwMDAuICgxS2cgPSAxMDAwZylcbiAgICAgIC8vIGhlbmNlIGVhY2ggb3RoZXIgY2FuY2VsIG91dCBhbmQgZy9LV2ggaXMgdGhlIHNhbWUgYXMga2cvTVdoXG4gICAgICBjb25zdCBncmlkX2VtaXNzaW9uID0gZGF0YS52YWx1ZSAvIDAuNDUzNTkyMzc7XG4gICAgICBkYXRhcG9pbnRzICs9IDE7XG4gICAgICByZXR1cm4gZ3JpZF9lbWlzc2lvbjtcbiAgICB9KTtcbiAgICByZXR1cm4ge2RhdGFwb2ludHMsIGRhdGF9O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZWlucHV0cyhpbnB1dHM6IG9iamVjdFtdKSB7XG4gICAgaW5wdXRzLmZvckVhY2goKGlucHV0OiBLZXlWYWx1ZVBhaXIpID0+IHtcbiAgICAgIGlmICghKCdsb2NhdGlvbicgaW4gaW5wdXQpKSB7XG4gICAgICAgIGNvbnN0IHtsYXRpdHVkZSwgbG9uZ2l0dWRlfSA9IHRoaXMuZ2V0TGF0aXR1ZGVMb25naXR1ZGVGcm9taW5wdXQoaW5wdXQpO1xuICAgICAgICBpZiAoaXNOYU4obGF0aXR1ZGUpIHx8IGlzTmFOKGxvbmdpdHVkZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xhdGl0dWRlIG9yIGxvbmdpdHVkZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCEoJ3RpbWVzdGFtcCcgaW4gaW5wdXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGltZXN0YW1wIGlzIG1pc3NpbmcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghKCdkdXJhdGlvbicgaW4gaW5wdXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZHVyYXRpb24gaXMgbWlzc2luZycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYXRpdHVkZUxvbmdpdHVkZUZyb21pbnB1dChpbnB1dDogS2V5VmFsdWVQYWlyKSB7XG4gICAgY29uc3QgbG9jYXRpb24gPSBpbnB1dFsnbG9jYXRpb24nXS5zcGxpdCgnLCcpOyAvL3NwbGl0IGxvY2F0aW9uIGludG8gbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZVxuICAgIGlmIChsb2NhdGlvbi5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2xvY2F0aW9uIHNob3VsZCBiZSBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSdcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsb2NhdGlvblswXSA9PT0gJycgfHwgbG9jYXRpb25bMV0gPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xhdGl0dWRlIG9yIGxvbmdpdHVkZSBpcyBtaXNzaW5nJyk7XG4gICAgfVxuICAgIGlmIChsb2NhdGlvblswXSA9PT0gJzAnIHx8IGxvY2F0aW9uWzFdID09PSAnMCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbGF0aXR1ZGUgb3IgbG9uZ2l0dWRlIGlzIG1pc3NpbmcnKTtcbiAgICB9XG4gICAgY29uc3QgbGF0aXR1ZGUgPSBwYXJzZUZsb2F0KGxvY2F0aW9uWzBdKTsgLy9jb252ZXJ0IGxhdGl0dWRlIHRvIGZsb2F0XG4gICAgY29uc3QgbG9uZ2l0dWRlID0gcGFyc2VGbG9hdChsb2NhdGlvblsxXSk7IC8vY29udmVydCBsb25naXR1ZGUgdG8gZmxvYXRcbiAgICByZXR1cm4ge2xhdGl0dWRlLCBsb25naXR1ZGV9O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlcm1pbmVpbnB1dFN0YXJ0RW5kKGlucHV0czogb2JqZWN0W10pIHtcbiAgICAvLyBsYXJnZXN0IHBvc3NpYmxlIHN0YXJ0IHRpbWVcbiAgICBsZXQgc3RhcnR0aW1lID0gZGF5anMoJzk5OTktMTItMzEnKTtcbiAgICAvLyBzbWFsbGVzdCBwb3NzaWJsZSBlbmQgdGltZVxuICAgIGxldCBlbmR0aW1lID0gZGF5anMoJzE5NzAtMDEtMDEnKTtcbiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQ6IEtleVZhbHVlUGFpcikgPT4ge1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBpbnB1dC5kdXJhdGlvbjtcblxuICAgICAgLy8gaWYgdGhlIGlucHV0IHRpbWVzdGFtcCBpcyBiZWZvcmUgdGhlIGN1cnJlbnQgc3RhcnR0aW1lLCBzZXQgaXQgYXMgdGhlIG5ldyBzdGFydHRpbWVcbiAgICAgIHN0YXJ0dGltZSA9IGRheWpzKGlucHV0LnRpbWVzdGFtcCkuaXNCZWZvcmUoc3RhcnR0aW1lKVxuICAgICAgICA/IGRheWpzKGlucHV0LnRpbWVzdGFtcClcbiAgICAgICAgOiBzdGFydHRpbWU7XG5cbiAgICAgIC8vIGlmIHRoZSBpbnB1dCB0aW1lc3RhbXAgKyBkdXJhdGlvbiBpcyBhZnRlciB0aGUgY3VycmVudCBlbmR0aW1lLCBzZXQgaXQgYXMgdGhlIG5ldyBlbmR0aW1lXG4gICAgICBlbmR0aW1lID0gZGF5anMoaW5wdXQudGltZXN0YW1wKS5hZGQoZHVyYXRpb24sICdzZWNvbmRzJykuaXNBZnRlcihlbmR0aW1lKVxuICAgICAgICA/IGRheWpzKGlucHV0LnRpbWVzdGFtcCkuYWRkKGR1cmF0aW9uLCAnc2Vjb25kcycpXG4gICAgICAgIDogZW5kdGltZTtcbiAgICB9KTtcbiAgICBjb25zdCBmZXRjaER1cmF0aW9uID0gZW5kdGltZS5kaWZmKHN0YXJ0dGltZSwgJ3NlY29uZHMnKTtcbiAgICBpZiAoZmV0Y2hEdXJhdGlvbiA+IDMyICogMjQgKiA2MCAqIDYwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdkdXJhdGlvbiBpcyB0b28gbG9uZy5XYXR0VGltZSBBUEkgb25seSBzdXBwb3J0cyB1cCB0byAzMiBkYXlzLiBBbGwgaW5wdXRzIG11c3QgYmUgd2l0aGluIDMyIGRheXMgb2YgZWFjaCBvdGhlci4gRHVyYXRpb24gb2YgJyArXG4gICAgICAgICAgZmV0Y2hEdXJhdGlvbiArXG4gICAgICAgICAgJyBzZWNvbmRzIGlzIHRvbyBsb25nLidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7c3RhcnRUaW1lOiBzdGFydHRpbWUsIGZldGNoRHVyYXRpb259O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKGlucHV0OiBLZXlWYWx1ZVBhaXIpOiBQcm9taXNlPEtleVZhbHVlUGFpcltdPiB7XG4gICAgY29uc3QgZHVyYXRpb24gPSBpbnB1dC5kdXJhdGlvbjtcbiAgICAvLyBXYXR0VGltZSBBUEkgb25seSBzdXBwb3J0cyB1cCB0byAzMiBkYXlzXG4gICAgaWYgKGR1cmF0aW9uID4gMzIgKiAyNCAqIDYwICogNjApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZHVyYXRpb24gaXMgdG9vIGxvbmcnKTtcbiAgICB9XG4gICAgY29uc3Qge2xhdGl0dWRlLCBsb25naXR1ZGV9ID0gdGhpcy5nZXRMYXRpdHVkZUxvbmdpdHVkZUZyb21pbnB1dChpbnB1dCk7XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICAgIHN0YXJ0dGltZTogZGF5anMoaW5wdXQudGltZXN0YW1wKS5mb3JtYXQoJ1lZWVktTU0tRERUSEg6bW06c3NaJyksXG4gICAgICBlbmR0aW1lOiBkYXlqcyhpbnB1dC50aW1lc3RhbXApLmFkZChkdXJhdGlvbiwgJ3NlY29uZHMnKSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF4aW9zXG4gICAgICAuZ2V0KGAke3RoaXMuYmFzZVVybH0vZGF0YWAsIHtcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMudG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgZmV0Y2hpbmcgZGF0YSBmcm9tIFdhdHRUaW1lIEFQSS4nICsgZSk7XG4gICAgICB9KTtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGZldGNoaW5nIGRhdGEgZnJvbSBXYXR0VGltZSBBUEkuJyArIHJlc3VsdC5zdGF0dXMpO1xuICAgIH1cbiAgICBpZiAoISgnZGF0YScgaW4gcmVzdWx0KSB8fCAhQXJyYXkuaXNBcnJheShyZXN1bHQuZGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZXNwb25zZSBmcm9tIFdhdHRUaW1lIEFQSS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5kYXRhLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZGF5anMoYS5wb2ludF90aW1lKS51bml4KCkgPiBkYXlqcyhiLnBvaW50X3RpbWUpLnVuaXgoKSA/IDEgOiAtMTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpZ3VyZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhdGljUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxJT3V0cHV0TW9kZWxJbnRlcmZhY2U+IHtcbiAgICB0aGlzLnN0YXRpY1BhcmFtcyA9IHN0YXRpY1BhcmFtcztcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIGlmICghc3RhdGljUGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc3RhdGljUGFyYW1zJyk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKHN0YXRpY1BhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtb2RlbElkZW50aWZpZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gV0FUVF9USU1FO1xuICB9XG59XG4iXX0=
@@ -1,95 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ModelsUniverse = void 0;
4
- const errors_1 = require("./errors");
5
- const config_1 = require("../config");
6
- const { ModelInitializationError, ModelCredentialError } = errors_1.ERRORS;
7
- const { GITHUB_PATH } = config_1.CONFIG;
8
- const { MISSING_CLASSNAME, NOT_OUTPUT_MODEL_EXTENSION, NOT_INITIALIZED_MODEL, MISSING_PATH, MODEL_DOESNT_EXIST, NOT_NATIVE_MODEL, } = config_1.STRINGS;
9
- /**
10
- * Models Initialization Lifecycle.
11
- */
12
- class ModelsUniverse {
13
- constructor() {
14
- /**
15
- * Models list.
16
- */
17
- this.initalizedModels = {};
18
- }
19
- /**
20
- * Checks if model is instance of `IOutputModelInterface`.
21
- */
22
- instanceOfModel(ClassContainer) {
23
- try {
24
- const testModel = new ClassContainer();
25
- const boolable = 'configure' in testModel && 'execute' in testModel;
26
- return boolable;
27
- }
28
- catch (error) {
29
- throw ModelInitializationError(MODEL_DOESNT_EXIST);
30
- }
31
- }
32
- /**
33
- * Returns plugin model. Checks if model is missing then rejects with error.
34
- * Then checks if `path` is starting with github, then grabs the repository name.
35
- * Imports module, then checks if it's a class which implements input model interface.
36
- */
37
- async handPluginModel(model, path) {
38
- if (!model) {
39
- throw new ModelCredentialError(MISSING_CLASSNAME);
40
- }
41
- if (!path) {
42
- throw new ModelCredentialError(MISSING_PATH);
43
- }
44
- if (path?.startsWith(GITHUB_PATH)) {
45
- const parts = path.split('/');
46
- path = parts[parts.length - 1];
47
- }
48
- if (!path.includes('if-models')) {
49
- console.log(NOT_NATIVE_MODEL);
50
- }
51
- const pluginModule = await Promise.resolve(`${path}`).then(s => require(s));
52
- if (this.instanceOfModel(pluginModule[model])) {
53
- return pluginModule[model];
54
- }
55
- throw new Error(NOT_OUTPUT_MODEL_EXTENSION);
56
- }
57
- /**
58
- * Initializes and registers model.
59
- */
60
- writeDown(modelToInitalize) {
61
- const { name, config, model, path } = modelToInitalize;
62
- const callback = async (graphOptions) => {
63
- const Model = await this.handPluginModel(model, path);
64
- const params = {
65
- ...config,
66
- ...graphOptions,
67
- };
68
- const initalizedModel = await new Model().configure(params);
69
- return initalizedModel;
70
- };
71
- this.initalizedModels = {
72
- ...this.initalizedModels,
73
- [name]: callback,
74
- };
75
- return this.initalizedModels;
76
- }
77
- /**
78
- * Returns existing model by `name`.
79
- */
80
- async getInitializedModel(modelName, config) {
81
- try {
82
- if (this.initalizedModels[modelName]) {
83
- return await this.initalizedModels[modelName](config);
84
- }
85
- }
86
- catch (error) {
87
- if (error instanceof Error) {
88
- throw new ModelInitializationError(error.message);
89
- }
90
- }
91
- throw new ModelInitializationError(NOT_INITIALIZED_MODEL(modelName));
92
- }
93
- }
94
- exports.ModelsUniverse = ModelsUniverse;
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLXVuaXZlcnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvbW9kZWxzLXVuaXZlcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUFnQztBQUVoQyxzQ0FBMEM7QUFRMUMsTUFBTSxFQUFDLHdCQUF3QixFQUFFLG9CQUFvQixFQUFDLEdBQUcsZUFBTSxDQUFDO0FBRWhFLE1BQU0sRUFBQyxXQUFXLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFDN0IsTUFBTSxFQUNKLGlCQUFpQixFQUNqQiwwQkFBMEIsRUFDMUIscUJBQXFCLEVBQ3JCLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsZ0JBQWdCLEdBQ2pCLEdBQUcsZ0JBQU8sQ0FBQztBQUVaOztHQUVHO0FBQ0gsTUFBYSxjQUFjO0lBQTNCO1FBQ0U7O1dBRUc7UUFDSSxxQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO0lBNEZqRCxDQUFDO0lBMUZDOztPQUVHO0lBQ0ssZUFBZSxDQUFDLGNBQW1CO1FBQ3pDLElBQUk7WUFDRixNQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBRXZDLE1BQU0sUUFBUSxHQUFHLFdBQVcsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQztZQUVwRSxPQUFPLFFBQVEsQ0FBQztTQUNqQjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsTUFBTSx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ3BEO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQWMsRUFBRSxJQUFhO1FBQ3pELElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixNQUFNLElBQUksb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNuRDtRQUVELElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxNQUFNLElBQUksb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDOUM7UUFFRCxJQUFJLElBQUksRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDaEM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDL0I7UUFFRCxNQUFNLFlBQVksR0FBRyx5QkFBYSxJQUFJLHlCQUFDLENBQUM7UUFFeEMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzdDLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzVCO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxnQkFBcUM7UUFDcEQsTUFBTSxFQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxHQUFHLGdCQUFnQixDQUFDO1FBRXJELE1BQU0sUUFBUSxHQUFHLEtBQUssRUFBRSxZQUEwQixFQUFFLEVBQUU7WUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUV0RCxNQUFNLE1BQU0sR0FBRztnQkFDYixHQUFHLE1BQU07Z0JBQ1QsR0FBRyxZQUFZO2FBQ2hCLENBQUM7WUFFRixNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTVELE9BQU8sZUFBZSxDQUFDO1FBQ3pCLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRztZQUN0QixHQUFHLElBQUksQ0FBQyxnQkFBZ0I7WUFDeEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRO1NBQ2pCLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsU0FBaUIsRUFBRSxNQUFXO1FBQzdELElBQUk7WUFDRixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDcEMsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUN2RDtTQUNGO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7Z0JBQzFCLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbkQ7U0FDRjtRQUVELE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7Q0FDRjtBQWhHRCx3Q0FnR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0VSUk9SU30gZnJvbSAnLi9lcnJvcnMnO1xuXG5pbXBvcnQge0NPTkZJRywgU1RSSU5HU30gZnJvbSAnLi4vY29uZmlnJztcblxuaW1wb3J0IHtcbiAgR3JhcGhPcHRpb25zLFxuICBJbXBsSW5pdGlhbGl6ZU1vZGVsLFxuICBJbml0YWxpemVkTW9kZWxzLFxufSBmcm9tICcuLi90eXBlcy9tb2RlbHMtdW5pdmVyc2UnO1xuXG5jb25zdCB7TW9kZWxJbml0aWFsaXphdGlvbkVycm9yLCBNb2RlbENyZWRlbnRpYWxFcnJvcn0gPSBFUlJPUlM7XG5cbmNvbnN0IHtHSVRIVUJfUEFUSH0gPSBDT05GSUc7XG5jb25zdCB7XG4gIE1JU1NJTkdfQ0xBU1NOQU1FLFxuICBOT1RfT1VUUFVUX01PREVMX0VYVEVOU0lPTixcbiAgTk9UX0lOSVRJQUxJWkVEX01PREVMLFxuICBNSVNTSU5HX1BBVEgsXG4gIE1PREVMX0RPRVNOVF9FWElTVCxcbiAgTk9UX05BVElWRV9NT0RFTCxcbn0gPSBTVFJJTkdTO1xuXG4vKipcbiAqIE1vZGVscyBJbml0aWFsaXphdGlvbiBMaWZlY3ljbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbHNVbml2ZXJzZSB7XG4gIC8qKlxuICAgKiBNb2RlbHMgbGlzdC5cbiAgICovXG4gIHB1YmxpYyBpbml0YWxpemVkTW9kZWxzOiBJbml0YWxpemVkTW9kZWxzID0ge307XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBtb2RlbCBpcyBpbnN0YW5jZSBvZiBgSU91dHB1dE1vZGVsSW50ZXJmYWNlYC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFuY2VPZk1vZGVsKENsYXNzQ29udGFpbmVyOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGVzdE1vZGVsID0gbmV3IENsYXNzQ29udGFpbmVyKCk7XG5cbiAgICAgIGNvbnN0IGJvb2xhYmxlID0gJ2NvbmZpZ3VyZScgaW4gdGVzdE1vZGVsICYmICdleGVjdXRlJyBpbiB0ZXN0TW9kZWw7XG5cbiAgICAgIHJldHVybiBib29sYWJsZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgTW9kZWxJbml0aWFsaXphdGlvbkVycm9yKE1PREVMX0RPRVNOVF9FWElTVCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcGx1Z2luIG1vZGVsLiBDaGVja3MgaWYgbW9kZWwgaXMgbWlzc2luZyB0aGVuIHJlamVjdHMgd2l0aCBlcnJvci5cbiAgICogVGhlbiBjaGVja3MgaWYgYHBhdGhgIGlzIHN0YXJ0aW5nIHdpdGggZ2l0aHViLCB0aGVuIGdyYWJzIHRoZSByZXBvc2l0b3J5IG5hbWUuXG4gICAqIEltcG9ydHMgbW9kdWxlLCB0aGVuIGNoZWNrcyBpZiBpdCdzIGEgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBpbnB1dCBtb2RlbCBpbnRlcmZhY2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRQbHVnaW5Nb2RlbChtb2RlbD86IHN0cmluZywgcGF0aD86IHN0cmluZykge1xuICAgIGlmICghbW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbENyZWRlbnRpYWxFcnJvcihNSVNTSU5HX0NMQVNTTkFNRSk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxDcmVkZW50aWFsRXJyb3IoTUlTU0lOR19QQVRIKTtcbiAgICB9XG5cbiAgICBpZiAocGF0aD8uc3RhcnRzV2l0aChHSVRIVUJfUEFUSCkpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLycpO1xuICAgICAgcGF0aCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIGlmICghcGF0aC5pbmNsdWRlcygnaWYtbW9kZWxzJykpIHtcbiAgICAgIGNvbnNvbGUubG9nKE5PVF9OQVRJVkVfTU9ERUwpO1xuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbk1vZHVsZSA9IGF3YWl0IGltcG9ydChwYXRoKTtcblxuICAgIGlmICh0aGlzLmluc3RhbmNlT2ZNb2RlbChwbHVnaW5Nb2R1bGVbbW9kZWxdKSkge1xuICAgICAgcmV0dXJuIHBsdWdpbk1vZHVsZVttb2RlbF07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKE5PVF9PVVRQVVRfTU9ERUxfRVhURU5TSU9OKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbmQgcmVnaXN0ZXJzIG1vZGVsLlxuICAgKi9cbiAgcHVibGljIHdyaXRlRG93bihtb2RlbFRvSW5pdGFsaXplOiBJbXBsSW5pdGlhbGl6ZU1vZGVsKSB7XG4gICAgY29uc3Qge25hbWUsIGNvbmZpZywgbW9kZWwsIHBhdGh9ID0gbW9kZWxUb0luaXRhbGl6ZTtcblxuICAgIGNvbnN0IGNhbGxiYWNrID0gYXN5bmMgKGdyYXBoT3B0aW9uczogR3JhcGhPcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBNb2RlbCA9IGF3YWl0IHRoaXMuaGFuZFBsdWdpbk1vZGVsKG1vZGVsLCBwYXRoKTtcblxuICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAuLi5jb25maWcsXG4gICAgICAgIC4uLmdyYXBoT3B0aW9ucyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGluaXRhbGl6ZWRNb2RlbCA9IGF3YWl0IG5ldyBNb2RlbCgpLmNvbmZpZ3VyZShwYXJhbXMpO1xuXG4gICAgICByZXR1cm4gaW5pdGFsaXplZE1vZGVsO1xuICAgIH07XG5cbiAgICB0aGlzLmluaXRhbGl6ZWRNb2RlbHMgPSB7XG4gICAgICAuLi50aGlzLmluaXRhbGl6ZWRNb2RlbHMsXG4gICAgICBbbmFtZV06IGNhbGxiYWNrLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5pbml0YWxpemVkTW9kZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZXhpc3RpbmcgbW9kZWwgYnkgYG5hbWVgLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEluaXRpYWxpemVkTW9kZWwobW9kZWxOYW1lOiBzdHJpbmcsIGNvbmZpZzogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmluaXRhbGl6ZWRNb2RlbHNbbW9kZWxOYW1lXSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pbml0YWxpemVkTW9kZWxzW21vZGVsTmFtZV0oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1vZGVsSW5pdGlhbGl6YXRpb25FcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgTW9kZWxJbml0aWFsaXphdGlvbkVycm9yKE5PVF9JTklUSUFMSVpFRF9NT0RFTChtb2RlbE5hbWUpKTtcbiAgfVxufVxuIl19
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Observatory = void 0;
4
- /**
5
- * Observatory is responsible for output calculations based on the `inputs` and the `model`.
6
- */
7
- class Observatory {
8
- /**
9
- * Init inputs object.
10
- */
11
- constructor(inputs) {
12
- this.outputs = [];
13
- this.inputs = inputs;
14
- }
15
- /**
16
- * Does investigations by given `output` information
17
- */
18
- async doInvestigationsWith(modelInstance) {
19
- const reuseCalculation = this.outputs.length ? this.outputs : this.inputs;
20
- this.outputs = await modelInstance.execute(reuseCalculation);
21
- return this;
22
- }
23
- /**
24
- * Getter for output data.
25
- */
26
- getOutputs() {
27
- return this.outputs;
28
- }
29
- }
30
- exports.Observatory = Observatory;
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YXRvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9vYnNlcnZhdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQTs7R0FFRztBQUNILE1BQWEsV0FBVztJQUl0Qjs7T0FFRztJQUNILFlBQVksTUFBVztRQUxmLFlBQU8sR0FBVSxFQUFFLENBQUM7UUFNMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLG9CQUFvQixDQUFDLGFBQW1DO1FBQ25FLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFMUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUU3RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBNUJELGtDQTRCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TW9kZWxQbHVnaW5JbnRlcmZhY2V9IGZyb20gJy4uL3R5cGVzL21vZGVsLWludGVyZmFjZSc7XG5cbi8qKlxuICogT2JzZXJ2YXRvcnkgaXMgcmVzcG9uc2libGUgZm9yIG91dHB1dCBjYWxjdWxhdGlvbnMgYmFzZWQgb24gdGhlIGBpbnB1dHNgIGFuZCB0aGUgYG1vZGVsYC5cbiAqL1xuZXhwb3J0IGNsYXNzIE9ic2VydmF0b3J5IHtcbiAgcHJpdmF0ZSBpbnB1dHM6IGFueVtdO1xuICBwcml2YXRlIG91dHB1dHM6IGFueVtdID0gW107XG5cbiAgLyoqXG4gICAqIEluaXQgaW5wdXRzIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGlucHV0czogYW55KSB7XG4gICAgdGhpcy5pbnB1dHMgPSBpbnB1dHM7XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBpbnZlc3RpZ2F0aW9ucyBieSBnaXZlbiBgb3V0cHV0YCBpbmZvcm1hdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRvSW52ZXN0aWdhdGlvbnNXaXRoKG1vZGVsSW5zdGFuY2U6IE1vZGVsUGx1Z2luSW50ZXJmYWNlKSB7XG4gICAgY29uc3QgcmV1c2VDYWxjdWxhdGlvbiA9IHRoaXMub3V0cHV0cy5sZW5ndGggPyB0aGlzLm91dHB1dHMgOiB0aGlzLmlucHV0cztcblxuICAgIHRoaXMub3V0cHV0cyA9IGF3YWl0IG1vZGVsSW5zdGFuY2UuZXhlY3V0ZShyZXVzZUNhbGN1bGF0aW9uKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3Igb3V0cHV0IGRhdGEuXG4gICAqL1xuICBwdWJsaWMgZ2V0T3V0cHV0cygpIHtcbiAgICByZXR1cm4gdGhpcy5vdXRwdXRzO1xuICB9XG59XG4iXX0=
@@ -1,109 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Supercomputer = void 0;
4
- const observatory_1 = require("./observatory");
5
- const errors_1 = require("./errors");
6
- const config_1 = require("../config");
7
- const { ImplValidationError } = errors_1.ERRORS;
8
- const { STRUCTURE_MALFORMED } = config_1.STRINGS;
9
- /**
10
- * Computer for `impl` documents.
11
- */
12
- class Supercomputer {
13
- constructor(impl, modelsHandbook) {
14
- this.olderChild = { name: '', info: {} };
15
- this.impl = impl;
16
- this.modelsHandbook = modelsHandbook;
17
- }
18
- /**
19
- * Flattens config entries.
20
- */
21
- flattenConfigValues(config) {
22
- if (!config) {
23
- return {};
24
- }
25
- const configModelNames = Object.keys(config);
26
- const values = configModelNames.reduce((acc, name) => {
27
- acc = {
28
- ...acc,
29
- ...config[name],
30
- };
31
- return acc;
32
- }, {});
33
- return values;
34
- }
35
- /**
36
- * Adds config entries to each obsercation object passed.
37
- */
38
- enrichInputs(inputs, config, nestedConfig) {
39
- const configValues = this.flattenConfigValues(config);
40
- const nestedConfigValues = this.flattenConfigValues(nestedConfig);
41
- return inputs.map((input) => ({
42
- ...input,
43
- ...configValues,
44
- ...nestedConfigValues,
45
- }));
46
- }
47
- /**
48
- * If child is top level, then initializes `this.olderChild`.
49
- * If `children` object contains `children` property, it means inputs are nested (calls compute again).
50
- * Otherwise enriches inputs, passes them to Observatory.
51
- * For each model from pipeline Observatory gathers inputs. Then results are stored.
52
- */
53
- async calculateOutputsForChild(childrenObject, params) {
54
- const { childName, areChildrenNested } = params;
55
- if (!areChildrenNested) {
56
- this.olderChild = {
57
- name: childName,
58
- info: this.impl.graph.children[childName],
59
- };
60
- }
61
- const { pipeline, inputs, config } = this.olderChild.info;
62
- if ('children' in childrenObject[childName]) {
63
- return this.compute(childrenObject[childName].children);
64
- }
65
- if (!('inputs' in childrenObject[childName])) {
66
- throw new ImplValidationError(STRUCTURE_MALFORMED(childName));
67
- }
68
- const specificInputs = areChildrenNested
69
- ? childrenObject[childName].inputs
70
- : inputs;
71
- const childrenConfig = childrenObject[childName].config || {};
72
- const enrichedInputs = this.enrichInputs(specificInputs, config, childrenConfig);
73
- const observatory = new observatory_1.Observatory(enrichedInputs);
74
- for (const modelName of pipeline) {
75
- const params = config && config[modelName];
76
- const modelInstance = await this.modelsHandbook.getInitializedModel(modelName, params);
77
- await observatory.doInvestigationsWith(modelInstance);
78
- }
79
- const outputs = observatory.getOutputs();
80
- if (areChildrenNested) {
81
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
82
- // @ts-ignore
83
- this.impl.graph.children[this.olderChild.name].children[childName].outputs = observatory.getOutputs();
84
- return;
85
- }
86
- this.impl.graph.children[this.olderChild.name].outputs = outputs;
87
- return;
88
- }
89
- /**
90
- * Checks if object is top level children or nested, then runs through all children and calculates outputs.
91
- */
92
- async compute(childrenObject) {
93
- const implOrChildren = childrenObject || this.impl;
94
- const areChildrenNested = !!childrenObject;
95
- const children = areChildrenNested
96
- ? implOrChildren
97
- : implOrChildren.graph.children;
98
- const childrenNames = Object.keys(children);
99
- for (const childName of childrenNames) {
100
- await this.calculateOutputsForChild(children, {
101
- childName,
102
- areChildrenNested,
103
- });
104
- }
105
- return this.impl;
106
- }
107
- }
108
- exports.Supercomputer = Supercomputer;
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwZXJjb21wdXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3N1cGVyY29tcHV0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsK0NBQTBDO0FBRTFDLHFDQUFnQztBQUVoQyxzQ0FBa0M7QUFLbEMsTUFBTSxFQUFDLG1CQUFtQixFQUFDLEdBQUcsZUFBTSxDQUFDO0FBRXJDLE1BQU0sRUFBQyxtQkFBbUIsRUFBQyxHQUFHLGdCQUFPLENBQUM7QUFFdEM7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFLeEIsWUFBWSxJQUFVLEVBQUUsY0FBOEI7UUFKOUMsZUFBVSxHQUFxQixFQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBQyxDQUFDO1FBSzFELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQixDQUFDLE1BQWM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBUSxFQUFFLElBQVksRUFBRSxFQUFFO1lBQ2hFLEdBQUcsR0FBRztnQkFDSixHQUFHLEdBQUc7Z0JBQ04sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO2FBQ2hCLENBQUM7WUFFRixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVQLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVksQ0FDbEIsTUFBcUIsRUFDckIsTUFBYyxFQUNkLFlBQW9CO1FBRXBCLE1BQU0sWUFBWSxHQUFH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SUFBSSxDQUFDLElBQUksQ0FBQztRQUNuRCxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDM0MsTUFBTSxRQUFRLEdBQWEsaUJBQWlCO1lBQzFDLENBQUMsQ0FBQyxjQUFjO1lBQ2hCLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVDLEtBQUssTUFBTSxTQUFTLElBQUksYUFBYSxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsRUFBRTtnQkFDNUMsU0FBUztnQkFDVCxpQkFBaUI7YUFDbEIsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBMUlELHNDQTBJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TW9kZWxzVW5pdmVyc2V9IGZyb20gJy4vbW9kZWxzLXVuaXZlcnNlJztcbmltcG9ydCB7T2JzZXJ2YXRvcnl9IGZyb20gJy4vb2JzZXJ2YXRvcnknO1xuXG5pbXBvcnQge0VSUk9SU30gZnJvbSAnLi9lcnJvcnMnO1xuXG5pbXBvcnQge1NUUklOR1N9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmltcG9ydCB7Q2hpbGRJbmZvcm1hdGlvbn0gZnJvbSAnLi4vdHlwZXMvc3VwZXJjb21wdXRlcic7XG5pbXBvcnQge0NoaWxkcmVuLCBDb25maWcsIEltcGwsIE1vZGVsUGFyYW1zfSBmcm9tICcuLi90eXBlcy9pbXBsJztcblxuY29uc3Qge0ltcGxWYWxpZGF0aW9uRXJyb3J9ID0gRVJST1JTO1xuXG5jb25zdCB7U1RSVUNUVVJFX01BTEZPUk1FRH0gPSBTVFJJTkdTO1xuXG4vKipcbiAqIENvbXB1dGVyIGZvciBgaW1wbGAgZG9jdW1lbnRzLlxuICovXG5leHBvcnQgY2xhc3MgU3VwZXJjb21wdXRlciB7XG4gIHByaXZhdGUgb2xkZXJDaGlsZDogQ2hpbGRJbmZvcm1hdGlvbiA9IHtuYW1lOiAnJywgaW5mbzoge319O1xuICBwcml2YXRlIGltcGw6IEltcGw7XG4gIHByaXZhdGUgbW9kZWxzSGFuZGJvb2s6IE1vZGVsc1VuaXZlcnNlO1xuXG4gIGNvbnN0cnVjdG9yKGltcGw6IEltcGwsIG1vZGVsc0hhbmRib29rOiBNb2RlbHNVbml2ZXJzZSkge1xuICAgIHRoaXMuaW1wbCA9IGltcGw7XG4gICAgdGhpcy5tb2RlbHNIYW5kYm9vayA9IG1vZGVsc0hhbmRib29rO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIGNvbmZpZyBlbnRyaWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBmbGF0dGVuQ29uZmlnVmFsdWVzKGNvbmZpZzogQ29uZmlnKSB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWdNb2RlbE5hbWVzID0gT2JqZWN0LmtleXMoY29uZmlnKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBjb25maWdNb2RlbE5hbWVzLnJlZHVjZSgoYWNjOiBhbnksIG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgYWNjID0ge1xuICAgICAgICAuLi5hY2MsXG4gICAgICAgIC4uLmNvbmZpZ1tuYW1lXSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGNvbmZpZyBlbnRyaWVzIHRvIGVhY2ggb2JzZXJjYXRpb24gb2JqZWN0IHBhc3NlZC5cbiAgICovXG4gIHByaXZhdGUgZW5yaWNoSW5wdXRzKFxuICAgIGlucHV0czogTW9kZWxQYXJhbXNbXSxcbiAgICBjb25maWc6IENvbmZpZyxcbiAgICBuZXN0ZWRDb25maWc6IENvbmZpZ1xuICApIHtcbiAgICBjb25zdCBjb25maWdWYWx1ZXMgPSB0aGlzLmZsYXR0ZW5Db25maWdWYWx1ZXMoY29uZmlnKTtcbiAgICBjb25zdCBuZXN0ZWRDb25maWdWYWx1ZXMgPSB0aGlzLmZsYXR0ZW5Db25maWdWYWx1ZXMobmVzdGVkQ29uZmlnKTtcblxuICAgIHJldHVybiBpbnB1dHMubWFwKChpbnB1dDogYW55KSA9PiAoe1xuICAgICAgLi4uaW5wdXQsXG4gICAgICAuLi5jb25maWdWYWx1ZXMsXG4gICAgICAuLi5uZXN0ZWRDb25maWdWYWx1ZXMsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGNoaWxkIGlzIHRvcCBsZXZlbCwgdGhlbiBpbml0aWFsaXplcyBgdGhpcy5vbGRlckNoaWxkYC5cbiAgICogSWYgYGNoaWxkcmVuYCBvYmplY3QgY29udGFpbnMgYGNoaWxkcmVuYCBwcm9wZXJ0eSwgaXQgbWVhbnMgaW5wdXRzIGFyZSBuZXN0ZWQgKGNhbGxzIGNvbXB1dGUgYWdhaW4pLlxuICAgKiBPdGhlcndpc2UgZW5yaWNoZXMgaW5wdXRzLCBwYXNzZXMgdGhlbSB0byBPYnNlcnZhdG9yeS5cbiAgICogRm9yIGVhY2ggbW9kZWwgZnJvbSBwaXBlbGluZSBPYnNlcnZhdG9yeSBnYXRoZXJzIGlucHV0cy4gVGhlbiByZXN1bHRzIGFyZSBzdG9yZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNhbGN1bGF0ZU91dHB1dHNGb3JDaGlsZChcbiAgICBjaGlsZHJlbk9iamVjdDogQ2hpbGRyZW4sXG4gICAgcGFyYW1zOiBhbnlcbiAgKSB7XG4gICAgY29uc3Qge2NoaWxkTmFtZSwgYXJlQ2hpbGRyZW5OZXN0ZWR9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFhcmVDaGlsZHJlbk5lc3RlZCkge1xuICAgICAgdGhpcy5vbGRlckNoaWxkID0ge1xuICAgICAgICBuYW1lOiBjaGlsZE5hbWUsXG4gICAgICAgIGluZm86IHRoaXMuaW1wbC5ncmFwaC5jaGlsZHJlbltjaGlsZE5hbWVdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7cGlwZWxpbmUsIGlucHV0cywgY29uZmlnfSA9IHRoaXMub2xkZXJDaGlsZC5pbmZvO1xuXG4gICAgaWYgKCdjaGlsZHJlbicgaW4gY2hpbGRyZW5PYmplY3RbY2hpbGROYW1lXSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZShjaGlsZHJlbk9iamVjdFtjaGlsZE5hbWVdLmNoaWxkcmVuKTtcbiAgICB9XG5cbiAgICBpZiAoISgnaW5wdXRzJyBpbiBjaGlsZHJlbk9iamVjdFtjaGlsZE5hbWVdKSkge1xuICAgICAgdGhyb3cgbmV3IEltcGxWYWxpZGF0aW9uRXJyb3IoU1RSVUNUVVJFX01BTEZPUk1FRChjaGlsZE5hbWUpKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGVjaWZpY0lucHV0cyA9IGFyZUNoaWxkcmVuTmVzdGVkXG4gICAgICA/IGNoaWxkcmVuT2JqZWN0W2NoaWxkTmFtZV0uaW5wdXRzXG4gICAgICA6IGlucHV0cztcblxuICAgIGNvbnN0IGNoaWxkcmVuQ29uZmlnID0gY2hpbGRyZW5PYmplY3RbY2hpbGROYW1lXS5jb25maWcgfHwge307XG5cbiAgICBjb25zdCBlbnJpY2hlZElucHV0cyA9IHRoaXMuZW5yaWNoSW5wdXRzKFxuICAgICAgc3BlY2lmaWNJbnB1dHMsXG4gICAgICBjb25maWcsXG4gICAgICBjaGlsZHJlbkNvbmZpZ1xuICAgICk7XG5cbiAgICBjb25zdCBvYnNlcnZhdG9yeSA9IG5ldyBPYnNlcnZhdG9yeShlbnJpY2hlZElucHV0cyk7XG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsTmFtZSBvZiBwaXBlbGluZSkge1xuICAgICAgY29uc3QgcGFyYW1zID0gY29uZmlnICYmIGNvbmZpZ1ttb2RlbE5hbWVdO1xuICAgICAgY29uc3QgbW9kZWxJbnN0YW5jZSA9IGF3YWl0IHRoaXMubW9kZWxzSGFuZGJvb2suZ2V0SW5pdGlhbGl6ZWRNb2RlbChcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBwYXJhbXNcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IG9ic2VydmF0b3J5LmRvSW52ZXN0aWdhdGlvbnNXaXRoKG1vZGVsSW5zdGFuY2UpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dHMgPSBvYnNlcnZhdG9yeS5nZXRPdXRwdXRzKCk7XG5cbiAgICBpZiAoYXJlQ2hpbGRyZW5OZXN0ZWQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMuaW1wbC5ncmFwaC5jaGlsZHJlblt0aGlzLm9sZGVyQ2hpbGQubmFtZV0uY2hpbGRyZW5bXG4gICAgICAgIGNoaWxkTmFtZVxuICAgICAgXS5vdXRwdXRzID0gb2JzZXJ2YXRvcnkuZ2V0T3V0cHV0cygpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbXBsLmdyYXBoLmNoaWxkcmVuW3RoaXMub2xkZXJDaGlsZC5uYW1lXS5vdXRwdXRzID0gb3V0cHV0cztcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIG9iamVjdCBpcyB0b3AgbGV2ZWwgY2hpbGRyZW4gb3IgbmVzdGVkLCB0aGVuIHJ1bnMgdGhyb3VnaCBhbGwgY2hpbGRyZW4gYW5kIGNhbGN1bGF0ZXMgb3V0cHV0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb21wdXRlKGNoaWxkcmVuT2JqZWN0PzogYW55KSB7XG4gICAgY29uc3QgaW1wbE9yQ2hpbGRyZW4gPSBjaGlsZHJlbk9iamVjdCB8fCB0aGlzLmltcGw7XG4gICAgY29uc3QgYXJlQ2hpbGRyZW5OZXN0ZWQgPSAhIWNoaWxkcmVuT2JqZWN0O1xuICAgIGNvbnN0IGNoaWxkcmVuOiBDaGlsZHJlbiA9IGFyZUNoaWxkcmVuTmVzdGVkXG4gICAgICA/IGltcGxPckNoaWxkcmVuXG4gICAgICA6IGltcGxPckNoaWxkcmVuLmdyYXBoLmNoaWxkcmVuO1xuICAgIGNvbnN0IGNoaWxkcmVuTmFtZXMgPSBPYmplY3Qua2V5cyhjaGlsZHJlbik7XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkTmFtZSBvZiBjaGlsZHJlbk5hbWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGN1bGF0ZU91dHB1dHNGb3JDaGlsZChjaGlsZHJlbiwge1xuICAgICAgICBjaGlsZE5hbWUsXG4gICAgICAgIGFyZUNoaWxkcmVuTmVzdGVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW1wbDtcbiAgfVxufVxuIl19
@@ -1,36 +0,0 @@
1
- # TDP Finder Model
2
-
3
- ## Scope
4
-
5
- The TDP Finder model finds the thermal design power (TDP) of a given processor by looking it up in the model datasets. There are scenarios where the lookup can return multiple possible TDP values. In these cases, we return the maximum of the possible values. There are also cases where no TDP can be found for a specific processor. In these cases, we throw an error. The TDP is then used by other models to calculate the `energy-cpu` value.
6
-
7
- ## Used DataSets
8
-
9
-
10
- [./data.csv](./data.csv) Dataset from https://www.kaggle.com/datasets/lincolnzh/cpu-specifications-dataset Licensed under [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)
11
-
12
- [./data2.csv](./data2.csv) Dataset from [Codecarbon](https://github.com/mlco2/codecarbon/blob/master/codecarbon/data/hardware/cpu_power.csv) Licensed under MIT
13
-
14
- [./boavizta_data.csv](./boavizta_data.csv) Dataset from Boavizta API [Data Source](https://github.com/Boavizta/boaviztapi/blob/main/boaviztapi/data/crowdsourcing/cpu_specs.csv) Licensed under MIT
15
-
16
-
17
- ## Implementation
18
-
19
- IEF implements the plugin based on the logic described above.
20
-
21
- ## Usage with IMPL
22
- * Model Name: `tdp-finder`
23
- ```yaml
24
- input:
25
- - physical-processor: Intel Xeon Platinum 8175M, AMD A8-9600
26
- ```
27
-
28
- ## Output in OMPL
29
- ```yaml
30
- input:
31
- - physical-processor: Intel Xeon Platinum 8175M
32
- output:
33
- - physical-processor: Intel Xeon Platinum 8175M
34
- tdp: 165
35
- ```
36
-
@@ -1,67 +0,0 @@
1
- name: gsf-demo-pipeline
2
- description:
3
- More complex pipeline example
4
- tags:
5
- kind: web
6
- complexity: moderate
7
- category: cloud
8
- initialize:
9
- models:
10
- - name: teads-curve
11
- kind: builtin
12
- - name: sci-m
13
- kind: builtin
14
- - name: sci-o
15
- kind: builtin
16
- - name: sci-e
17
- kind: builtin
18
- - name: eshoppen-net
19
- kind: builtin
20
- - name: eshoppen-mem
21
- kind: builtin
22
- - name: eshoppen-cpu
23
- kind: builtin
24
- - name: sampler
25
- kind: shell
26
- graph:
27
- children:
28
- child:
29
- pipeline:
30
- - eshoppen-mem
31
- - eshoppen-cpu
32
- - eshoppen-net
33
- - sci-e
34
- - sci-o
35
- - sampler
36
- config:
37
- teads-curve:
38
- thermal-design-power: 1
39
- sampler:
40
- executable: python3 /usr/local/bin/sampler
41
- inputs:
42
- - timestamp: 2023-07-06T00:00 # [KEYWORD] [NO-SUBFIELDS] time when measurement occurred
43
- processor: Intel® Core™ i7-1185G7
44
- data-in: 1
45
- data-out: 1
46
- net-energy: 1
47
- n-hours: 1
48
- n-chips: 1
49
- tdp-mem: 1
50
- tdp-coeff: 1
51
- duration: 3600 # Secs
52
- thermal-design-power: 28 # W
53
- cpu-util: 18.392
54
- grid-carbon-intensity: 951 # gCO2e/kWh
55
- - timestamp: 2023-08-06T00:00 # [KEYWORD] [NO-SUBFIELDS] time when measurement occurred
56
- processor: Intel® Core™ i7-1185G7
57
- data-in: 1
58
- data-out: 1
59
- net-energy: 1
60
- n-hours: 1
61
- n-chips: 1
62
- tdp-mem: 1
63
- tdp-coeff: 1
64
- duration: 3600 # Secs
65
- thermal-design-power: 20 # W
66
- cpu-util: 16
67
- grid-carbon-intensity: 800 # gCO2e/kWh
@@ -1,22 +0,0 @@
1
- name: ccf-demo
2
- description: example impl invoking CCF model
3
- initialize:
4
- models:
5
- - name: azure-importer
6
- kind: builtin
7
- graph:
8
- children:
9
- child:
10
- pipeline:
11
- - azure-importer
12
- config:
13
- azure-importer:
14
- metric: Percentage CPU
15
- interval: PT1M
16
- aggregation: avg
17
- observations:
18
- - null
19
- impacts:
20
- - metric: Percentage CPU
21
- interval: PT1M
22
- aggregation: avg