@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.
- package/.examples/ompls/azure.yml +205 -0
- package/.github/workflows/nodejs-ci.yml +0 -8
- package/README.md +48 -9
- package/build/config/config.d.ts +0 -23
- package/build/config/config.js +1 -24
- package/build/index.js +3 -4
- package/build/lib/models-universe.js +95 -0
- package/build/lib/observatory.js +31 -0
- package/build/lib/supercomputer.js +109 -0
- package/examples/impls/test/azure.yml +8 -8
- package/examples/impls/test/ccf.yml +5 -3
- package/examples/impls/test/if-demo.yml +19 -9
- package/examples/impls/test/metadata.yml +3 -2
- package/examples/impls/test/nesting.yml +10 -13
- package/examples/impls/test/sci-e.yml +1 -1
- package/examples/impls/test/sci-m.yml +2 -2
- package/examples/impls/test/sci-o.yml +2 -4
- package/examples/impls/test/sci.yml +1 -2
- package/examples/impls/test/shell.yml +2 -1
- package/examples/impls/{tdp-finder-test.yml → test/tdp-finder.yml} +8 -8
- package/examples/ompls/ccf.yml +3 -1
- package/examples/ompls/if-demo.yml +46 -22
- package/package.json +12 -5
- package/tsconfig.build.json +7 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/build/__mocks__/azure/index.d.ts +0 -11
- package/build/__mocks__/azure/index.js +0 -132
- package/build/__mocks__/boavizta/countries.json +0 -138
- package/build/__mocks__/boavizta/instance_types.json +0 -625
- package/build/__mocks__/boavizta/providers.json +0 -1
- package/build/__mocks__/fs/index.d.ts +0 -3
- package/build/__mocks__/fs/index.js +0 -56
- package/build/__mocks__/model-universe/index.d.ts +0 -31
- package/build/__mocks__/model-universe/index.js +0 -64
- package/build/__mocks__/watt-time/data.json +0 -119
- package/build/__tests__/integration/ompl/index.test.d.ts +0 -1
- package/build/__tests__/integration/ompl/index.test.js +0 -61
- package/build/__tests__/unit/lib/azure-importer/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/azure-importer/index.test.js +0 -152
- package/build/__tests__/unit/lib/boavizta/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/boavizta/index.test.js +0 -579
- package/build/__tests__/unit/lib/case-studies/aveva.test.d.ts +0 -1
- package/build/__tests__/unit/lib/case-studies/aveva.test.js +0 -36
- package/build/__tests__/unit/lib/case-studies/emem.test.d.ts +0 -1
- package/build/__tests__/unit/lib/case-studies/emem.test.js +0 -108
- package/build/__tests__/unit/lib/case-studies/eshoppen.test.d.ts +0 -1
- package/build/__tests__/unit/lib/case-studies/eshoppen.test.js +0 -53
- package/build/__tests__/unit/lib/case-studies/sci-accenture.test.d.ts +0 -1
- package/build/__tests__/unit/lib/case-studies/sci-accenture.test.js +0 -23
- package/build/__tests__/unit/lib/ccf/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/ccf/index.test.js +0 -223
- package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.js +0 -73
- package/build/__tests__/unit/lib/sci/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/sci/index.test.js +0 -106
- package/build/__tests__/unit/lib/sci-e/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/sci-e/index.test.js +0 -30
- package/build/__tests__/unit/lib/sci-m/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/sci-m/index.test.js +0 -58
- package/build/__tests__/unit/lib/sci-o/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/sci-o/index.test.js +0 -42
- package/build/__tests__/unit/lib/shell-imp/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/shell-imp/index.test.js +0 -21
- package/build/__tests__/unit/lib/tdp-finder/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/tdp-finder/index.test.js +0 -62
- package/build/__tests__/unit/lib/teads-aws/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/teads-aws/index.test.js +0 -170
- package/build/__tests__/unit/lib/teads-curve/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/teads-curve/index.test.js +0 -146
- package/build/__tests__/unit/lib/watt-time/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/watt-time/index.test.js +0 -106
- package/build/__tests__/unit/util/args.test.d.ts +0 -1
- package/build/__tests__/unit/util/args.test.js +0 -92
- package/build/__tests__/unit/util/models-universe.test.d.ts +0 -1
- package/build/__tests__/unit/util/models-universe.test.js +0 -193
- package/build/__tests__/unit/util/observatory.test.d.ts +0 -1
- package/build/__tests__/unit/util/observatory.test.js +0 -99
- package/build/__tests__/unit/util/supercomputer.test.d.ts +0 -1
- package/build/__tests__/unit/util/supercomputer.test.js +0 -231
- package/build/__tests__/unit/util/yaml.test.d.ts +0 -1
- package/build/__tests__/unit/util/yaml.test.js +0 -59
- package/build/lib/azure-importer/index.d.ts +0 -55
- package/build/lib/azure-importer/index.js +0 -314
- package/build/lib/boavizta/index.d.ts +0 -53
- package/build/lib/boavizta/index.js +0 -254
- package/build/lib/case-studies/aveva-model.d.ts +0 -29
- package/build/lib/case-studies/aveva-model.js +0 -53
- package/build/lib/case-studies/emem-model.d.ts +0 -42
- package/build/lib/case-studies/emem-model.js +0 -93
- package/build/lib/case-studies/eshoppen-model.d.ts +0 -24
- package/build/lib/case-studies/eshoppen-model.js +0 -123
- package/build/lib/case-studies/index.d.ts +0 -4
- package/build/lib/case-studies/index.js +0 -21
- package/build/lib/case-studies/sci-accenture-model.d.ts +0 -10
- package/build/lib/case-studies/sci-accenture-model.js +0 -37
- package/build/lib/ccf/aws-embodied.json +0 -5591
- package/build/lib/ccf/aws-instances.json +0 -21116
- package/build/lib/ccf/aws-use.json +0 -79
- package/build/lib/ccf/azure-embodied.json +0 -6547
- package/build/lib/ccf/azure-instances.json +0 -8332
- package/build/lib/ccf/azure-use.json +0 -58
- package/build/lib/ccf/gcp-embodied.json +0 -3049
- package/build/lib/ccf/gcp-instances.json +0 -3880
- package/build/lib/ccf/gcp-use.json +0 -58
- package/build/lib/ccf/index.d.ts +0 -63
- package/build/lib/ccf/index.js +0 -338
- package/build/lib/cloud-instance-metadata/aws-instances.json +0 -1
- package/build/lib/cloud-instance-metadata/azure-instances.json +0 -1
- package/build/lib/cloud-instance-metadata/index.d.ts +0 -15
- package/build/lib/cloud-instance-metadata/index.js +0 -104
- package/build/lib/index.d.ts +0 -14
- package/build/lib/index.js +0 -32
- package/build/lib/interfaces/ccf.d.ts +0 -19
- package/build/lib/interfaces/ccf.js +0 -3
- package/build/lib/interfaces/index.d.ts +0 -7
- package/build/lib/interfaces/index.js +0 -18
- package/build/lib/sci/index.d.ts +0 -13
- package/build/lib/sci/index.js +0 -131
- package/build/lib/sci-e/index.d.ts +0 -38
- package/build/lib/sci-e/index.js +0 -85
- package/build/lib/sci-m/index.d.ts +0 -10
- package/build/lib/sci-m/index.js +0 -124
- package/build/lib/sci-o/index.d.ts +0 -17
- package/build/lib/sci-o/index.js +0 -52
- package/build/lib/shell-imp/index.d.ts +0 -32
- package/build/lib/shell-imp/index.js +0 -82
- package/build/lib/tdp-finder/index.d.ts +0 -19
- package/build/lib/tdp-finder/index.js +0 -98
- package/build/lib/teads-aws/aws-embodied.json +0 -1
- package/build/lib/teads-aws/aws-instances.json +0 -1
- package/build/lib/teads-aws/index.d.ts +0 -58
- package/build/lib/teads-aws/index.js +0 -208
- package/build/lib/teads-curve/index.d.ts +0 -52
- package/build/lib/teads-curve/index.js +0 -158
- package/build/lib/watt-time/index.d.ts +0 -18
- package/build/lib/watt-time/index.js +0 -204
- package/build/util/models-universe.js +0 -95
- package/build/util/observatory.js +0 -31
- package/build/util/supercomputer.js +0 -109
- package/docs/implementations/tdp-finder.md +0 -36
- package/examples/impls/test/complex-pipeline.yml +0 -67
- package/examples/impls/test/toto.yaml +0 -22
- package/tsconfig.tsbuildinfo +0 -1
- /package/build/{util → lib}/models-universe.d.ts +0 -0
- /package/build/{util → lib}/observatory.d.ts +0 -0
- /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
|