@grnsft/if 0.0.2
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/.devcontainer/devcontainer.json +38 -0
- package/.editorconfig +8 -0
- package/.env.example +9 -0
- package/.eslintignore +4 -0
- package/.eslintrc.json +8 -0
- package/.github/ISSUE_TEMPLATE/agenda.md +36 -0
- package/.github/ISSUE_TEMPLATE/blank-issue.md +10 -0
- package/.github/ISSUE_TEMPLATE/feedback.md +42 -0
- package/.github/ISSUE_TEMPLATE/model-plugin.md +63 -0
- package/.github/ISSUE_TEMPLATE/user-story.md +10 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +21 -0
- package/.github/workflows/nodejs-ci.yml +34 -0
- package/.gitmodules +3 -0
- package/.prettierrc.js +3 -0
- package/CONTRIBUTING.md +194 -0
- package/LICENSE +21 -0
- package/Makefile +16 -0
- package/README.md +67 -0
- package/build/__mocks__/azure/index.d.ts +11 -0
- package/build/__mocks__/azure/index.js +132 -0
- package/build/__mocks__/boavizta/countries.json +138 -0
- package/build/__mocks__/boavizta/instance_types.json +625 -0
- package/build/__mocks__/boavizta/providers.json +1 -0
- package/build/__mocks__/fs/index.d.ts +3 -0
- package/build/__mocks__/fs/index.js +56 -0
- package/build/__mocks__/model-universe/index.d.ts +33 -0
- package/build/__mocks__/model-universe/index.js +68 -0
- package/build/__mocks__/watt-time/data.json +119 -0
- package/build/__tests__/integration/ompl/index.test.d.ts +1 -0
- package/build/__tests__/integration/ompl/index.test.js +61 -0
- package/build/__tests__/unit/lib/azure-importer/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/azure-importer/index.test.js +152 -0
- package/build/__tests__/unit/lib/boavizta/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/boavizta/index.test.js +579 -0
- package/build/__tests__/unit/lib/case-studies/aveva.test.d.ts +1 -0
- package/build/__tests__/unit/lib/case-studies/aveva.test.js +36 -0
- package/build/__tests__/unit/lib/case-studies/emem.test.d.ts +1 -0
- package/build/__tests__/unit/lib/case-studies/emem.test.js +108 -0
- package/build/__tests__/unit/lib/case-studies/eshoppen.test.d.ts +1 -0
- package/build/__tests__/unit/lib/case-studies/eshoppen.test.js +53 -0
- package/build/__tests__/unit/lib/case-studies/sci-accenture.test.d.ts +1 -0
- package/build/__tests__/unit/lib/case-studies/sci-accenture.test.js +23 -0
- package/build/__tests__/unit/lib/ccf/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/ccf/index.test.js +223 -0
- package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.js +73 -0
- package/build/__tests__/unit/lib/sci/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/sci/index.test.js +106 -0
- package/build/__tests__/unit/lib/sci-e/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/sci-e/index.test.js +30 -0
- package/build/__tests__/unit/lib/sci-m/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/sci-m/index.test.js +58 -0
- package/build/__tests__/unit/lib/sci-o/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/sci-o/index.test.js +42 -0
- package/build/__tests__/unit/lib/shell-imp/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/shell-imp/index.test.js +21 -0
- package/build/__tests__/unit/lib/tdp-finder/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/tdp-finder/index.test.js +62 -0
- package/build/__tests__/unit/lib/teads-aws/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/teads-aws/index.test.js +170 -0
- package/build/__tests__/unit/lib/teads-curve/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/teads-curve/index.test.js +146 -0
- package/build/__tests__/unit/lib/watt-time/index.test.d.ts +1 -0
- package/build/__tests__/unit/lib/watt-time/index.test.js +106 -0
- package/build/__tests__/unit/util/args.test.d.ts +1 -0
- package/build/__tests__/unit/util/args.test.js +92 -0
- package/build/__tests__/unit/util/models-universe.test.d.ts +1 -0
- package/build/__tests__/unit/util/models-universe.test.js +211 -0
- package/build/__tests__/unit/util/observatory.test.d.ts +1 -0
- package/build/__tests__/unit/util/observatory.test.js +91 -0
- package/build/__tests__/unit/util/supercomputer.test.d.ts +1 -0
- package/build/__tests__/unit/util/supercomputer.test.js +231 -0
- package/build/__tests__/unit/util/yaml.test.d.ts +1 -0
- package/build/__tests__/unit/util/yaml.test.js +59 -0
- package/build/config/config.d.ts +32 -0
- package/build/config/config.js +74 -0
- package/build/config/index.d.ts +2 -0
- package/build/config/index.js +8 -0
- package/build/config/strings.d.ts +14 -0
- package/build/config/strings.js +30 -0
- package/build/index.d.ts +1 -0
- package/build/index.js +46 -0
- package/build/lib/azure-importer/index.d.ts +55 -0
- package/build/lib/azure-importer/index.js +314 -0
- package/build/lib/boavizta/index.d.ts +53 -0
- package/build/lib/boavizta/index.js +254 -0
- package/build/lib/case-studies/aveva-model.d.ts +29 -0
- package/build/lib/case-studies/aveva-model.js +53 -0
- package/build/lib/case-studies/emem-model.d.ts +42 -0
- package/build/lib/case-studies/emem-model.js +93 -0
- package/build/lib/case-studies/eshoppen-model.d.ts +24 -0
- package/build/lib/case-studies/eshoppen-model.js +123 -0
- package/build/lib/case-studies/index.d.ts +4 -0
- package/build/lib/case-studies/index.js +21 -0
- package/build/lib/case-studies/sci-accenture-model.d.ts +10 -0
- package/build/lib/case-studies/sci-accenture-model.js +37 -0
- package/build/lib/ccf/aws-embodied.json +5591 -0
- package/build/lib/ccf/aws-instances.json +21116 -0
- package/build/lib/ccf/aws-use.json +79 -0
- package/build/lib/ccf/azure-embodied.json +6547 -0
- package/build/lib/ccf/azure-instances.json +8332 -0
- package/build/lib/ccf/azure-use.json +58 -0
- package/build/lib/ccf/gcp-embodied.json +3049 -0
- package/build/lib/ccf/gcp-instances.json +3880 -0
- package/build/lib/ccf/gcp-use.json +58 -0
- package/build/lib/ccf/index.d.ts +63 -0
- package/build/lib/ccf/index.js +338 -0
- package/build/lib/cloud-instance-metadata/aws-instances.json +1 -0
- package/build/lib/cloud-instance-metadata/azure-instances.json +1 -0
- package/build/lib/cloud-instance-metadata/index.d.ts +15 -0
- package/build/lib/cloud-instance-metadata/index.js +104 -0
- package/build/lib/index.d.ts +15 -0
- package/build/lib/index.js +32 -0
- package/build/lib/interfaces/ccf.d.ts +19 -0
- package/build/lib/interfaces/ccf.js +3 -0
- package/build/lib/interfaces/index.d.ts +7 -0
- package/build/lib/interfaces/index.js +18 -0
- package/build/lib/sci/index.d.ts +13 -0
- package/build/lib/sci/index.js +131 -0
- package/build/lib/sci-e/index.d.ts +38 -0
- package/build/lib/sci-e/index.js +85 -0
- package/build/lib/sci-m/index.d.ts +10 -0
- package/build/lib/sci-m/index.js +124 -0
- package/build/lib/sci-o/index.d.ts +17 -0
- package/build/lib/sci-o/index.js +52 -0
- package/build/lib/shell-imp/index.d.ts +32 -0
- package/build/lib/shell-imp/index.js +82 -0
- package/build/lib/tdp-finder/index.d.ts +19 -0
- package/build/lib/tdp-finder/index.js +98 -0
- package/build/lib/teads-aws/aws-embodied.json +1 -0
- package/build/lib/teads-aws/aws-instances.json +1 -0
- package/build/lib/teads-aws/index.d.ts +58 -0
- package/build/lib/teads-aws/index.js +208 -0
- package/build/lib/teads-curve/index.d.ts +52 -0
- package/build/lib/teads-curve/index.js +158 -0
- package/build/lib/watt-time/index.d.ts +18 -0
- package/build/lib/watt-time/index.js +204 -0
- package/build/types/azure-importer.d.ts +29 -0
- package/build/types/azure-importer.js +3 -0
- package/build/types/boavizta.d.ts +7 -0
- package/build/types/boavizta.js +3 -0
- package/build/types/common.d.ts +7 -0
- package/build/types/common.js +9 -0
- package/build/types/impl.d.ts +40 -0
- package/build/types/impl.js +3 -0
- package/build/types/models-universe.d.ts +24 -0
- package/build/types/models-universe.js +3 -0
- package/build/types/process-args.d.ts +7 -0
- package/build/types/process-args.js +3 -0
- package/build/types/supercomputer.d.ts +4 -0
- package/build/types/supercomputer.js +3 -0
- package/build/util/args.d.ts +8 -0
- package/build/util/args.js +48 -0
- package/build/util/errors.d.ts +6 -0
- package/build/util/errors.js +22 -0
- package/build/util/helpers.d.ts +4 -0
- package/build/util/helpers.js +18 -0
- package/build/util/models-universe.d.ts +28 -0
- package/build/util/models-universe.js +95 -0
- package/build/util/observatory.d.ts +20 -0
- package/build/util/observatory.js +31 -0
- package/build/util/supercomputer.d.ts +30 -0
- package/build/util/supercomputer.js +109 -0
- package/build/util/validations.d.ts +25 -0
- package/build/util/validations.js +52 -0
- package/build/util/yaml.d.ts +13 -0
- package/build/util/yaml.js +36 -0
- package/coverage/clover.xml +1172 -0
- package/coverage/coverage-final.json +27 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/config/config.ts.html +310 -0
- package/coverage/lcov-report/config/index.html +146 -0
- package/coverage/lcov-report/config/index.ts.html +91 -0
- package/coverage/lcov-report/config/strings.ts.html +118 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +341 -0
- package/coverage/lcov-report/lib/boavizta/index.html +116 -0
- package/coverage/lcov-report/lib/boavizta/index.ts.html +1171 -0
- package/coverage/lcov-report/lib/case-studies/aveva-model.ts.html +277 -0
- package/coverage/lcov-report/lib/case-studies/emem-model.ts.html +439 -0
- package/coverage/lcov-report/lib/case-studies/eshoppen-model.ts.html +550 -0
- package/coverage/lcov-report/lib/case-studies/index.html +176 -0
- package/coverage/lcov-report/lib/case-studies/index.ts.html +97 -0
- package/coverage/lcov-report/lib/case-studies/sci-accenture-model.ts.html +232 -0
- package/coverage/lcov-report/lib/ccf/index.html +116 -0
- package/coverage/lcov-report/lib/ccf/index.ts.html +1339 -0
- package/coverage/lcov-report/lib/cloud-instance-metadata/index.html +116 -0
- package/coverage/lcov-report/lib/cloud-instance-metadata/index.ts.html +370 -0
- package/coverage/lcov-report/lib/index.html +116 -0
- package/coverage/lcov-report/lib/index.ts.html +121 -0
- package/coverage/lcov-report/lib/sci/index.html +116 -0
- package/coverage/lcov-report/lib/sci/index.ts.html +571 -0
- package/coverage/lcov-report/lib/sci-e/index.html +116 -0
- package/coverage/lcov-report/lib/sci-e/index.ts.html +403 -0
- package/coverage/lcov-report/lib/sci-m/index.html +116 -0
- package/coverage/lcov-report/lib/sci-m/index.ts.html +487 -0
- package/coverage/lcov-report/lib/sci-o/index.html +116 -0
- package/coverage/lcov-report/lib/sci-o/index.ts.html +265 -0
- package/coverage/lcov-report/lib/shell-imp/index.html +116 -0
- package/coverage/lcov-report/lib/shell-imp/index.ts.html +376 -0
- package/coverage/lcov-report/lib/teads-aws/index.html +116 -0
- package/coverage/lcov-report/lib/teads-aws/index.ts.html +823 -0
- package/coverage/lcov-report/lib/teads-curve/index.html +116 -0
- package/coverage/lcov-report/lib/teads-curve/index.ts.html +625 -0
- package/coverage/lcov-report/lib/watt-time/index.html +116 -0
- package/coverage/lcov-report/lib/watt-time/index.ts.html +829 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/types/common.ts.html +109 -0
- package/coverage/lcov-report/types/index.html +116 -0
- package/coverage/lcov-report/util/args.ts.html +244 -0
- package/coverage/lcov-report/util/index.html +176 -0
- package/coverage/lcov-report/util/models-universe.ts.html +679 -0
- package/coverage/lcov-report/util/observatory.ts.html +229 -0
- package/coverage/lcov-report/util/supercomputer.ts.html +466 -0
- package/coverage/lcov-report/util/yaml.ts.html +193 -0
- package/coverage/lcov.info +2094 -0
- package/docs/implementations/tdp-finder.md +36 -0
- package/examples/impls/case-studies/accenture.yml +155 -0
- package/examples/impls/case-studies/aveva.yaml +48 -0
- package/examples/impls/case-studies/azure-yassine.yaml +67 -0
- package/examples/impls/case-studies/boavizta.yml +26 -0
- package/examples/impls/case-studies/dow_msft.yml +173 -0
- package/examples/impls/case-studies/farm-insights.yaml +35 -0
- package/examples/impls/case-studies/gsf-website.yaml +93 -0
- package/examples/impls/case-studies/msft-eshoppen.yaml +162 -0
- package/examples/impls/case-studies/msft-green-ai.yaml +58 -0
- package/examples/impls/case-studies/ntt-data-on-premise.yaml +201 -0
- package/examples/impls/tdp-finder-test.yml +19 -0
- package/examples/impls/test/azure.yml +26 -0
- package/examples/impls/test/ccf.yml +19 -0
- package/examples/impls/test/complex-pipeline.yml +67 -0
- package/examples/impls/test/if-demo.yml +51 -0
- package/examples/impls/test/metadata.yml +20 -0
- package/examples/impls/test/nesting.yml +65 -0
- package/examples/impls/test/sci-e.yml +21 -0
- package/examples/impls/test/sci-m.yml +24 -0
- package/examples/impls/test/sci-o.yml +28 -0
- package/examples/impls/test/sci.yml +27 -0
- package/examples/impls/test/shell.yml +18 -0
- package/examples/impls/test/toto.yaml +22 -0
- package/examples/ompls/azure.yml +145 -0
- package/examples/ompls/ccf.yml +27 -0
- package/examples/ompls/complex-pipeline.yml +105 -0
- package/examples/ompls/full-sci.yml +64 -0
- package/examples/ompls/if-demo.yml +493 -0
- package/examples/ompls/metadata.yml +29 -0
- package/examples/ompls/nesting.yml +107 -0
- package/examples/ompls/sci-e.yml +23 -0
- package/examples/ompls/sci-m.yml +33 -0
- package/examples/ompls/sci-o.yml +29 -0
- package/examples/ompls/sci.yml +36 -0
- package/examples/ompls/shell.yml +23 -0
- package/jest.config.js +14 -0
- package/package.json +71 -0
- package/scripts/impact-test.sh +12 -0
- package/src/__mocks__/boavizta/countries.json +138 -0
- package/src/__mocks__/boavizta/instance_types.json +625 -0
- package/src/__mocks__/boavizta/providers.json +1 -0
- package/src/__mocks__/watt-time/data.json +119 -0
- package/src/config/units.yaml +125 -0
- package/src/lib/ccf/aws-embodied.json +5591 -0
- package/src/lib/ccf/aws-instances.json +21116 -0
- package/src/lib/ccf/aws-use.json +79 -0
- package/src/lib/ccf/azure-embodied.json +6547 -0
- package/src/lib/ccf/azure-instances.json +8332 -0
- package/src/lib/ccf/azure-use.json +58 -0
- package/src/lib/ccf/gcp-embodied.json +3049 -0
- package/src/lib/ccf/gcp-instances.json +3880 -0
- package/src/lib/ccf/gcp-use.json +58 -0
- package/src/lib/cloud-instance-metadata/aws-instances.json +1 -0
- package/src/lib/cloud-instance-metadata/azure-instances.json +1 -0
- package/src/lib/shell-imp/sampler +30 -0
- package/src/lib/tdp-finder/README.md +7 -0
- package/src/lib/tdp-finder/boavizta_data.csv +1768 -0
- package/src/lib/tdp-finder/data.csv +4460 -0
- package/src/lib/tdp-finder/data2.csv +2162 -0
- package/src/lib/teads-aws/aws-embodied.json +1 -0
- package/src/lib/teads-aws/aws-instances.json +1 -0
- package/tsconfig.test.json +39 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/yarn-error.log +5854 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { IOutputModelInterface } from '../interfaces';
|
|
2
|
+
export declare class TeadsAWS implements IOutputModelInterface {
|
|
3
|
+
authParams: object | undefined;
|
|
4
|
+
name: string | undefined;
|
|
5
|
+
private computeInstances;
|
|
6
|
+
private instanceType;
|
|
7
|
+
private expectedLifespan;
|
|
8
|
+
private interpolation;
|
|
9
|
+
constructor();
|
|
10
|
+
/**
|
|
11
|
+
* Defined for compatibility. Not used in TEADS.
|
|
12
|
+
*/
|
|
13
|
+
authenticate(authParams: object): void;
|
|
14
|
+
/**
|
|
15
|
+
* Configures the TEADS Plugin for IEF
|
|
16
|
+
* @param {string} name name of the resource
|
|
17
|
+
* @param {Object} staticParams static parameters for the resource
|
|
18
|
+
* @param {string} staticParams.instance-type instance type from the list of supported instances
|
|
19
|
+
* @param {number} staticParams.expected-lifespan expected lifespan of the instance in years
|
|
20
|
+
* @param {Interpolation} staticParams.interpolation expected lifespan of the instance in years
|
|
21
|
+
*/
|
|
22
|
+
configure(name: string, staticParams?: object | undefined): Promise<IOutputModelInterface>;
|
|
23
|
+
/**
|
|
24
|
+
* Calculate the total emissions for a list of inputs
|
|
25
|
+
*
|
|
26
|
+
* Each input require:
|
|
27
|
+
* @param {Object[]} inputs ISO 8601 timestamp string
|
|
28
|
+
* @param {string} inputs[].timestamp ISO 8601 timestamp string
|
|
29
|
+
* @param {number} inputs[].duration input duration in seconds
|
|
30
|
+
* @param {number} inputs[].cpu-util percentage cpu usage
|
|
31
|
+
*/
|
|
32
|
+
execute(inputs: object | object[] | undefined): Promise<any[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Returns model identifier
|
|
35
|
+
*/
|
|
36
|
+
modelIdentifier(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Standardize the instance metrics for all the vendors
|
|
39
|
+
*
|
|
40
|
+
* Maps the instance metrics to a standard format (min, max, idle, 10%, 50%, 100%) for all the vendors
|
|
41
|
+
*/
|
|
42
|
+
standardizeInstanceMetrics(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Calculates the energy consumption for a single input
|
|
45
|
+
* requires
|
|
46
|
+
*
|
|
47
|
+
* duration: duration of the input in seconds
|
|
48
|
+
* cpu-util: cpu usage in percentage
|
|
49
|
+
* timestamp: RFC3339 timestamp string
|
|
50
|
+
*
|
|
51
|
+
* Uses a spline method for AWS and linear interpolation for GCP and Azure
|
|
52
|
+
*/
|
|
53
|
+
private calculateEnergy;
|
|
54
|
+
/**
|
|
55
|
+
* Calculates the embodied emissions for a given input
|
|
56
|
+
*/
|
|
57
|
+
private embodiedEmissions;
|
|
58
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TeadsAWS = void 0;
|
|
4
|
+
const typescript_cubic_spline_1 = require("typescript-cubic-spline");
|
|
5
|
+
const AWS_INSTANCES = require("./aws-instances.json");
|
|
6
|
+
const AWS_EMBODIED = require("./aws-embodied.json");
|
|
7
|
+
const config_1 = require("../../config");
|
|
8
|
+
const common_1 = require("../../types/common");
|
|
9
|
+
const { MODEL_IDS } = config_1.CONFIG;
|
|
10
|
+
const { TEADS_AWS } = MODEL_IDS;
|
|
11
|
+
class TeadsAWS {
|
|
12
|
+
constructor() {
|
|
13
|
+
// compute instances grouped by the vendor with usage data
|
|
14
|
+
this.computeInstances = {};
|
|
15
|
+
// list of all the by Architecture
|
|
16
|
+
this.instanceType = '';
|
|
17
|
+
this.expectedLifespan = 4 * 365 * 24 * 3600;
|
|
18
|
+
this.interpolation = common_1.Interpolation.LINEAR;
|
|
19
|
+
this.standardizeInstanceMetrics();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Defined for compatibility. Not used in TEADS.
|
|
23
|
+
*/
|
|
24
|
+
authenticate(authParams) {
|
|
25
|
+
this.authParams = authParams;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Configures the TEADS Plugin for IEF
|
|
29
|
+
* @param {string} name name of the resource
|
|
30
|
+
* @param {Object} staticParams static parameters for the resource
|
|
31
|
+
* @param {string} staticParams.instance-type instance type from the list of supported instances
|
|
32
|
+
* @param {number} staticParams.expected-lifespan expected lifespan of the instance in years
|
|
33
|
+
* @param {Interpolation} staticParams.interpolation expected lifespan of the instance in years
|
|
34
|
+
*/
|
|
35
|
+
async configure(name, staticParams = undefined) {
|
|
36
|
+
this.name = name;
|
|
37
|
+
if (staticParams === undefined) {
|
|
38
|
+
throw new Error('Required Parameters not provided');
|
|
39
|
+
}
|
|
40
|
+
if ('instance-type' in staticParams) {
|
|
41
|
+
const instanceType = staticParams['instance-type'];
|
|
42
|
+
if (instanceType in this.computeInstances) {
|
|
43
|
+
this.instanceType = instanceType;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
throw new Error('Instance Type not supported');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else if (this.instanceType === '') {
|
|
50
|
+
throw new Error('Instance Type not provided');
|
|
51
|
+
}
|
|
52
|
+
if ('expected-lifespan' in staticParams) {
|
|
53
|
+
this.expectedLifespan = staticParams['expected-lifespan'];
|
|
54
|
+
}
|
|
55
|
+
if ('interpolation' in staticParams) {
|
|
56
|
+
this.interpolation = staticParams?.interpolation;
|
|
57
|
+
}
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Calculate the total emissions for a list of inputs
|
|
62
|
+
*
|
|
63
|
+
* Each input require:
|
|
64
|
+
* @param {Object[]} inputs ISO 8601 timestamp string
|
|
65
|
+
* @param {string} inputs[].timestamp ISO 8601 timestamp string
|
|
66
|
+
* @param {number} inputs[].duration input duration in seconds
|
|
67
|
+
* @param {number} inputs[].cpu-util percentage cpu usage
|
|
68
|
+
*/
|
|
69
|
+
async execute(inputs) {
|
|
70
|
+
if (inputs === undefined) {
|
|
71
|
+
throw new Error('Required Parameters not provided');
|
|
72
|
+
}
|
|
73
|
+
if (!Array.isArray(inputs)) {
|
|
74
|
+
throw new Error('inputs should be an array');
|
|
75
|
+
}
|
|
76
|
+
if (this.instanceType === '') {
|
|
77
|
+
throw new Error('Configuration is incomplete');
|
|
78
|
+
}
|
|
79
|
+
return inputs.map((input) => {
|
|
80
|
+
this.configure(this.name, input);
|
|
81
|
+
const e = this.calculateEnergy(input);
|
|
82
|
+
const m = this.embodiedEmissions(input);
|
|
83
|
+
input['energy'] = e;
|
|
84
|
+
input['embodied-carbon'] = m;
|
|
85
|
+
return input;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Returns model identifier
|
|
90
|
+
*/
|
|
91
|
+
modelIdentifier() {
|
|
92
|
+
return TEADS_AWS;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Standardize the instance metrics for all the vendors
|
|
96
|
+
*
|
|
97
|
+
* Maps the instance metrics to a standard format (min, max, idle, 10%, 50%, 100%) for all the vendors
|
|
98
|
+
*/
|
|
99
|
+
standardizeInstanceMetrics() {
|
|
100
|
+
AWS_INSTANCES.forEach((instance) => {
|
|
101
|
+
const cpus = parseInt(instance['Instance vCPU'], 10);
|
|
102
|
+
this.computeInstances[instance['Instance type']] = {
|
|
103
|
+
consumption: {
|
|
104
|
+
idle: parseFloat(instance['Instance @ Idle'].replace(',', '.')),
|
|
105
|
+
tenPercent: parseFloat(instance['Instance @ 10%'].replace(',', '.')),
|
|
106
|
+
fiftyPercent: parseFloat(instance['Instance @ 50%'].replace(',', '.')),
|
|
107
|
+
hundredPercent: parseFloat(instance['Instance @ 100%'].replace(',', '.')),
|
|
108
|
+
},
|
|
109
|
+
vCPUs: cpus,
|
|
110
|
+
maxvCPUs: parseInt(instance['Platform Total Number of vCPU'], 10),
|
|
111
|
+
name: instance['Instance type'],
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
AWS_EMBODIED.forEach((instance) => {
|
|
115
|
+
this.computeInstances[instance['type']].embodiedEmission =
|
|
116
|
+
instance['total'];
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Calculates the energy consumption for a single input
|
|
121
|
+
* requires
|
|
122
|
+
*
|
|
123
|
+
* duration: duration of the input in seconds
|
|
124
|
+
* cpu-util: cpu usage in percentage
|
|
125
|
+
* timestamp: RFC3339 timestamp string
|
|
126
|
+
*
|
|
127
|
+
* Uses a spline method for AWS and linear interpolation for GCP and Azure
|
|
128
|
+
*/
|
|
129
|
+
calculateEnergy(input) {
|
|
130
|
+
if (!('duration' in input) ||
|
|
131
|
+
!('cpu-util' in input) ||
|
|
132
|
+
!('timestamp' in input)) {
|
|
133
|
+
throw new Error('Required Parameters duration,cpu-util,timestamp not provided for input');
|
|
134
|
+
}
|
|
135
|
+
const duration = input['duration']; // Duration is in seconds.
|
|
136
|
+
const cpu = input['cpu-util']; // Convert cpu usage to percentage.
|
|
137
|
+
const x = [0, 10, 50, 100]; // Get the wattage for the instance type.
|
|
138
|
+
const y = [
|
|
139
|
+
this.computeInstances[this.instanceType].consumption.idle ?? 0,
|
|
140
|
+
this.computeInstances[this.instanceType].consumption.tenPercent ?? 0,
|
|
141
|
+
this.computeInstances[this.instanceType].consumption.fiftyPercent ?? 0,
|
|
142
|
+
this.computeInstances[this.instanceType].consumption.hundredPercent ?? 0,
|
|
143
|
+
];
|
|
144
|
+
const spline = new typescript_cubic_spline_1.default(x, y);
|
|
145
|
+
let wattage = 0.0;
|
|
146
|
+
if (this.interpolation === common_1.Interpolation.SPLINE) {
|
|
147
|
+
wattage = spline.at(cpu);
|
|
148
|
+
}
|
|
149
|
+
else if (this.interpolation === common_1.Interpolation.LINEAR) {
|
|
150
|
+
// base rate is from which level of cpu linear interpolation is applied at
|
|
151
|
+
let base_rate = 0;
|
|
152
|
+
let base_cpu = 0;
|
|
153
|
+
let ratio = 0;
|
|
154
|
+
// find the base rate and ratio
|
|
155
|
+
for (let i = 0; i < x.length; i++) {
|
|
156
|
+
if (cpu === x[i]) {
|
|
157
|
+
base_rate = y[i];
|
|
158
|
+
base_cpu = x[i];
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
else if (cpu > x[i] && cpu < x[i + 1]) {
|
|
162
|
+
base_rate = y[i];
|
|
163
|
+
base_cpu = x[i];
|
|
164
|
+
ratio = (y[i + 1] - y[i]) / (x[i + 1] - x[i]);
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// sum of base_rate + (cpu - base_cpu) * ratio = total rate of cpu usage
|
|
169
|
+
wattage = base_rate + (cpu - base_cpu) * ratio;
|
|
170
|
+
}
|
|
171
|
+
// duration is in seconds
|
|
172
|
+
// wattage is in watts
|
|
173
|
+
// eg: 30W x 300s = 9000 J
|
|
174
|
+
// 1 Wh = 3600 J
|
|
175
|
+
// 9000 J / 3600 = 2.5 Wh
|
|
176
|
+
// J / 3600 = Wh
|
|
177
|
+
// 2.5 Wh / 1000 = 0.0025 kWh
|
|
178
|
+
// Wh / 1000 = kWh
|
|
179
|
+
// (wattage * duration) / (seconds in an hour) / 1000 = kWh
|
|
180
|
+
return (wattage * duration) / 3600 / 1000;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Calculates the embodied emissions for a given input
|
|
184
|
+
*/
|
|
185
|
+
embodiedEmissions(input) {
|
|
186
|
+
// duration
|
|
187
|
+
const durationInHours = input['duration'] / 3600;
|
|
188
|
+
// M = TE * (TR/EL) * (RR/TR)
|
|
189
|
+
// Where:
|
|
190
|
+
// TE = Total Embodied Emissions, the sum of Life Cycle Assessment(LCA) emissions for all hardware components
|
|
191
|
+
// TR = Time Reserved, the length of time the hardware is reserved for use by the software
|
|
192
|
+
// EL = Expected Lifespan, the anticipated time that the equipment will be installed
|
|
193
|
+
// RR = Resources Reserved, the number of resources reserved for use by the software.
|
|
194
|
+
// TR = Total Resources, the total number of resources available.
|
|
195
|
+
const totalEmissions = this.computeInstances[this.instanceType].embodiedEmission ?? 0;
|
|
196
|
+
const timeReserved = durationInHours;
|
|
197
|
+
const expectedLifespan = this.expectedLifespan / 3600;
|
|
198
|
+
const reservedResources = this.computeInstances[this.instanceType].vCPUs ?? 1.0;
|
|
199
|
+
const totalResources = this.computeInstances[this.instanceType].maxVCPUs ?? 1.0;
|
|
200
|
+
// Multiply totalEmissions by 1000 to convert from kgCO2e to gCO2e
|
|
201
|
+
return (totalEmissions *
|
|
202
|
+
1000 *
|
|
203
|
+
(timeReserved / expectedLifespan) *
|
|
204
|
+
(reservedResources / totalResources));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
exports.TeadsAWS = TeadsAWS;
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RlYWRzLWF3cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBNkM7QUFFN0Msc0RBQXNEO0FBQ3RELG9EQUFvRDtBQUlwRCx5Q0FBb0M7QUFFcEMsK0NBQStEO0FBRS9ELE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFDM0IsTUFBTSxFQUFDLFNBQVMsRUFBQyxHQUFHLFNBQVMsQ0FBQztBQUU5QixNQUFhLFFBQVE7SUFhbkI7UUFWQSwwREFBMEQ7UUFDbEQscUJBQWdCLEdBRXBCLEVBQUUsQ0FBQztRQUVQLGtDQUFrQztRQUMxQixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixxQkFBZ0IsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDdkMsa0JBQWEsR0FBRyxzQkFBYSxDQUFDLE1BQU0sQ0FBQztRQUczQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsVUFBa0I7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUNiLElBQVksRUFDWixlQUFtQyxTQUFTO1FBRTVDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWpCLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7U0FDckQ7UUFFRCxJQUFJLGVBQWUsSUFBSSxZQUFZLEVBQUU7WUFDbkMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBVyxDQUFDO1lBQzdELElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDekMsSUFBSSxD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QUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDO1FBQzNELGtFQUFrRTtRQUNsRSxPQUFPLENBQ0wsY0FBYztZQUNkLElBQUk7WUFDSixDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQztZQUNqQyxDQUFDLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxDQUNyQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBdk9ELDRCQXVPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTcGxpbmUgZnJvbSAndHlwZXNjcmlwdC1jdWJpYy1zcGxpbmUnO1xuXG5pbXBvcnQgKiBhcyBBV1NfSU5TVEFOQ0VTIGZyb20gJy4vYXdzLWluc3RhbmNlcy5qc29uJztcbmltcG9ydCAqIGFzIEFXU19FTUJPRElFRCBmcm9tICcuL2F3cy1lbWJvZGllZC5qc29uJztcblxuaW1wb3J0IHtJT3V0cHV0TW9kZWxJbnRlcmZhY2V9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQge0NPTkZJR30gZnJvbSAnLi4vLi4vY29uZmlnJztcblxuaW1wb3J0IHtLZXlWYWx1ZVBhaXIsIEludGVycG9sYXRpb259IGZyb20gJy4uLy4uL3R5cGVzL2NvbW1vbic7XG5cbmNvbnN0IHtNT0RFTF9JRFN9ID0gQ09ORklHO1xuY29uc3Qge1RFQURTX0FXU30gPSBNT0RFTF9JRFM7XG5cbmV4cG9ydCBjbGFzcyBUZWFkc0FXUyBpbXBsZW1lbnRzIElPdXRwdXRNb2RlbEludGVyZmFjZSB7XG4gIGF1dGhQYXJhbXM6IG9iamVjdCB8IHVuZGVmaW5lZDsgLy8gRGVmaW5lZCBmb3IgY29tcGF0aWJpbGl0eS4gTm90IHVzZWQgaW4gVEVBRFMuXG4gIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDsgLy8gbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2VcbiAgLy8gY29tcHV0ZSBpbnN0YW5jZXMgZ3JvdXBlZCBieSB0aGUgdmVuZG9yIHdpdGggdXNhZ2UgZGF0YVxuICBwcml2YXRlIGNvbXB1dGVJbnN0YW5jZXM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBLZXlWYWx1ZVBhaXI7XG4gIH0gPSB7fTtcblxuICAvLyBsaXN0IG9mIGFsbCB0aGUgYnkgQXJjaGl0ZWN0dXJlXG4gIHByaXZhdGUgaW5zdGFuY2VUeXBlID0gJyc7XG4gIHByaXZhdGUgZXhwZWN0ZWRMaWZlc3BhbiA9IDQgKiAzNjUgKiAyNCAqIDM2MDA7XG4gIHByaXZhdGUgaW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRpb24uTElORUFSO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RhbmRhcmRpemVJbnN0YW5jZU1ldHJpY3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZCBpbiBURUFEUy5cbiAgICovXG4gIGF1dGhlbnRpY2F0ZShhdXRoUGFyYW1zOiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGhQYXJhbXMgPSBhdXRoUGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqICBDb25maWd1cmVzIHRoZSBURUFEUyBQbHVnaW4gZm9yIElFRlxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgcmVzb3VyY2VcbiAgICogIEBwYXJhbSB7T2JqZWN0fSBzdGF0aWNQYXJhbXMgc3RhdGljIHBhcmFtZXRlcnMgZm9yIHRoZSByZXNvdXJjZVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IHN0YXRpY1BhcmFtcy5pbnN0YW5jZS10eXBlIGluc3RhbmNlIHR5cGUgZnJvbSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgaW5zdGFuY2VzXG4gICAqICBAcGFyYW0ge251bWJlcn0gc3RhdGljUGFyYW1zLmV4cGVjdGVkLWxpZmVzcGFuIGV4cGVjdGVkIGxpZmVzcGFuIG9mIHRoZSBpbnN0YW5jZSBpbiB5ZWFyc1xuICAgKiAgQHBhcmFtIHtJbnRlcnBvbGF0aW9ufSBzdGF0aWNQYXJhbXMuaW50ZXJwb2xhdGlvbiBleHBlY3RlZCBsaWZlc3BhbiBvZiB0aGUgaW5zdGFuY2UgaW4geWVhcnNcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhdGljUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxJT3V0cHV0TW9kZWxJbnRlcmZhY2U+IHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXG4gICAgaWYgKHN0YXRpY1BhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIFBhcmFtZXRlcnMgbm90IHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCdpbnN0YW5jZS10eXBlJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlVHlwZSA9IHN0YXRpY1BhcmFtc1snaW5zdGFuY2UtdHlwZSddIGFzIHN0cmluZztcbiAgICAgIGlmIChpbnN0YW5jZVR5cGUgaW4gdGhpcy5jb21wdXRlSW5zdGFuY2VzKSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VUeXBlID0gaW5zdGFuY2VUeXBlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN0YW5jZSBUeXBlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5zdGFuY2VUeXBlID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN0YW5jZSBUeXBlIG5vdCBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGlmICgnZXhwZWN0ZWQtbGlmZXNwYW4nIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy5leHBlY3RlZExpZmVzcGFuID0gc3RhdGljUGFyYW1zWydleHBlY3RlZC1saWZlc3BhbiddIGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBpZiAoJ2ludGVycG9sYXRpb24nIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uID0gc3RhdGljUGFyYW1zPy5pbnRlcnBvbGF0aW9uIGFzIEludGVycG9sYXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSB0b3RhbCBlbWlzc2lvbnMgZm9yIGEgbGlzdCBvZiBpbnB1dHNcbiAgICpcbiAgICogRWFjaCBpbnB1dCByZXF1aXJlOlxuICAgKiAgQHBhcmFtIHtPYmplY3RbXX0gaW5wdXRzICBJU08gODYwMSB0aW1lc3RhbXAgc3RyaW5nXG4gICAqICBAcGFyYW0ge3N0cmluZ30gaW5wdXRzW10udGltZXN0YW1wIElTTyA4NjAxIHRpbWVzdGFtcCBzdHJpbmdcbiAgICogIEBwYXJhbSB7bnVtYmVyfSBpbnB1dHNbXS5kdXJhdGlvbiBpbnB1dCBkdXJhdGlvbiBpbiBzZWNvbmRzXG4gICAqICBAcGFyYW0ge251bWJlcn0gaW5wdXRzW10uY3B1LXV0aWwgcGVyY2VudGFnZSBjcHUgdXNhZ2VcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoaW5wdXRzOiBvYmplY3QgfCBvYmplY3RbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoaW5wdXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgUGFyYW1ldGVycyBub3QgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXRzIHNob3VsZCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmluc3RhbmNlVHlwZSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlndXJhdGlvbiBpcyBpbmNvbXBsZXRlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlucHV0cy5tYXAoKGlucHV0OiBLZXlWYWx1ZVBhaXIpID0+IHtcbiAgICAgIHRoaXMuY29uZmlndXJlKHRoaXMubmFtZSEsIGlucHV0KTtcbiAgICAgIGNvbnN0IGUgPSB0aGlzLmNhbGN1bGF0ZUVuZXJneShpbnB1dCk7XG4gICAgICBjb25zdCBtID0gdGhpcy5lbWJvZGllZEVtaXNzaW9ucyhpbnB1dCk7XG4gICAgICBpbnB1dFsnZW5lcmd5J10gPSBlO1xuICAgICAgaW5wdXRbJ2VtYm9kaWVkLWNhcmJvbiddID0gbTtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1vZGVsIGlkZW50aWZpZXJcbiAgICovXG4gIG1vZGVsSWRlbnRpZmllcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBURUFEU19BV1M7XG4gIH1cblxuICAvKipcbiAgICogU3RhbmRhcmRpemUgdGhlIGluc3RhbmNlIG1ldHJpY3MgZm9yIGFsbCB0aGUgdmVuZG9yc1xuICAgKlxuICAgKiBNYXBzIHRoZSBpbnN0YW5jZSBtZXRyaWNzIHRvIGEgc3RhbmRhcmQgZm9ybWF0IChtaW4sIG1heCwgaWRsZSwgMTAlLCA1MCUsIDEwMCUpIGZvciBhbGwgdGhlIHZlbmRvcnNcbiAgICovXG4gIHN0YW5kYXJkaXplSW5zdGFuY2VNZXRyaWNzKCkge1xuICAgIEFXU19JTlNUQU5DRVMuZm9yRWFjaCgoaW5zdGFuY2U6IEtleVZhbHVlUGFpcikgPT4ge1xuICAgICAgY29uc3QgY3B1cyA9IHBhcnNlSW50KGluc3RhbmNlWydJbnN0YW5jZSB2Q1BVJ10sIDEwKTtcbiAgICAgIHRoaXMuY29tcHV0ZUluc3RhbmNlc1tpbnN0YW5jZVsnSW5zdGFuY2UgdHlwZSddXSA9IHtcbiAgICAgICAgY29uc3VtcHRpb246IHtcbiAgICAgICAgICBpZGxlOiBwYXJzZUZsb2F0KGluc3RhbmNlWydJbnN0YW5jZSBAIElkbGUnXS5yZXBsYWNlKCcsJywgJy4nKSksXG4gICAgICAgICAgdGVuUGVyY2VudDogcGFyc2VGbG9hdChpbnN0YW5jZVsnSW5zdGFuY2UgQCAxMCUnXS5yZXBsYWNlKCcsJywgJy4nKSksXG4gICAgICAgICAgZmlmdHlQZXJjZW50OiBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgaW5zdGFuY2VbJ0luc3RhbmNlIEAgNTAlJ10ucmVwbGFjZSgnLCcsICcuJylcbiAgICAgICAgICApLFxuICAgICAgICAgIGh1bmRyZWRQZXJjZW50OiBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgaW5zdGFuY2VbJ0luc3RhbmNlIEAgMTAwJSddLnJlcGxhY2UoJywnLCAnLicpXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgdkNQVXM6IGNwdXMsXG4gICAgICAgIG1heHZDUFVzOiBwYXJzZUludChpbnN0YW5jZVsnUGxhdGZvcm0gVG90YWwgTnVtYmVyIG9mIHZDUFUnXSwgMTApLFxuICAgICAgICBuYW1lOiBpbnN0YW5jZVsnSW5zdGFuY2UgdHlwZSddLFxuICAgICAgfSBhcyBLZXlWYWx1ZVBhaXI7XG4gICAgfSk7XG4gICAgQVdTX0VNQk9ESUVELmZvckVhY2goKGluc3RhbmNlOiBLZXlWYWx1ZVBhaXIpID0+IHtcbiAgICAgIHRoaXMuY29tcHV0ZUluc3RhbmNlc1tpbnN0YW5jZVsndHlwZSddXS5lbWJvZGllZEVtaXNzaW9uID1cbiAgICAgICAgaW5zdGFuY2VbJ3RvdGFsJ107XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgZW5lcmd5IGNvbnN1bXB0aW9uIGZvciBhIHNpbmdsZSBpbnB1dFxuICAgKiByZXF1aXJlc1xuICAgKlxuICAgKiBkdXJhdGlvbjogZHVyYXRpb24gb2YgdGhlIGlucHV0IGluIHNlY29uZHNcbiAgICogY3B1LXV0aWw6IGNwdSB1c2FnZSBpbiBwZXJjZW50YWdlXG4gICAqIHRpbWVzdGFtcDogUkZDMzMzOSB0aW1lc3RhbXAgc3RyaW5nXG4gICAqXG4gICAqIFVzZXMgYSBzcGxpbmUgbWV0aG9kIGZvciBBV1MgYW5kIGxpbmVhciBpbnRlcnBvbGF0aW9uIGZvciBHQ1AgYW5kIEF6dXJlXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUVuZXJneShpbnB1dDogS2V5VmFsdWVQYWlyKSB7XG4gICAgaWYgKFxuICAgICAgISgnZHVyYXRpb24nIGluIGlucHV0KSB8fFxuICAgICAgISgnY3B1LXV0aWwnIGluIGlucHV0KSB8fFxuICAgICAgISgndGltZXN0YW1wJyBpbiBpbnB1dClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JlcXVpcmVkIFBhcmFtZXRlcnMgZHVyYXRpb24sY3B1LXV0aWwsdGltZXN0YW1wIG5vdCBwcm92aWRlZCBmb3IgaW5wdXQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uID0gaW5wdXRbJ2R1cmF0aW9uJ107IC8vIER1cmF0aW9uIGlzIGluIHNlY29uZHMuXG4gICAgY29uc3QgY3B1ID0gaW5wdXRbJ2NwdS11dGlsJ107IC8vIENvbnZlcnQgY3B1IHVzYWdlIHRvIHBlcmNlbnRhZ2UuXG5cbiAgICBjb25zdCB4ID0gWzAsIDEwLCA1MCwgMTAwXTsgLy8gR2V0IHRoZSB3YXR0YWdlIGZvciB0aGUgaW5zdGFuY2UgdHlwZS5cbiAgICBjb25zdCB5OiBudW1iZXJbXSA9IFtcbiAgICAgIHRoaXMuY29tcHV0ZUluc3RhbmNlc1t0aGlzLmluc3RhbmNlVHlwZV0uY29uc3VtcHRpb24uaWRsZSA/PyAwLFxuICAgICAgdGhpcy5jb21wdXRlSW5zdGFuY2VzW3RoaXMuaW5zdGFuY2VUeXBlXS5jb25zdW1wdGlvbi50ZW5QZXJjZW50ID8/IDAsXG4gICAgICB0aGlzLmNvbXB1dGVJbnN0YW5jZXNbdGhpcy5pbnN0YW5jZVR5cGVdLmNvbnN1bXB0aW9uLmZpZnR5UGVyY2VudCA/PyAwLFxuICAgICAgdGhpcy5jb21wdXRlSW5zdGFuY2VzW3RoaXMuaW5zdGFuY2VUeXBlXS5jb25zdW1wdGlvbi5odW5kcmVkUGVyY2VudCA/PyAwLFxuICAgIF07XG5cbiAgICBjb25zdCBzcGxpbmUgPSBuZXcgU3BsaW5lKHgsIHkpO1xuXG4gICAgbGV0IHdhdHRhZ2UgPSAwLjA7XG4gICAgaWYgKHRoaXMuaW50ZXJwb2xhdGlvbiA9PT0gSW50ZXJwb2xhdGlvbi5TUExJTkUpIHtcbiAgICAgIHdhdHRhZ2UgPSBzcGxpbmUuYXQoY3B1KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW50ZXJwb2xhdGlvbiA9PT0gSW50ZXJwb2xhdGlvbi5MSU5FQVIpIHtcbiAgICAgIC8vIGJhc2UgcmF0ZSBpcyBmcm9tIHdoaWNoIGxldmVsIG9mIGNwdSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpcyBhcHBsaWVkIGF0XG4gICAgICBsZXQgYmFzZV9yYXRlID0gMDtcbiAgICAgIGxldCBiYXNlX2NwdSA9IDA7XG4gICAgICBsZXQgcmF0aW8gPSAwO1xuICAgICAgLy8gZmluZCB0aGUgYmFzZSByYXRlIGFuZCByYXRpb1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjcHUgPT09IHhbaV0pIHtcbiAgICAgICAgICBiYXNlX3JhdGUgPSB5W2ldO1xuICAgICAgICAgIGJhc2VfY3B1ID0geFtpXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChjcHUgPiB4W2ldICYmIGNwdSA8IHhbaSArIDFdKSB7XG4gICAgICAgICAgYmFzZV9yYXRlID0geVtpXTtcbiAgICAgICAgICBiYXNlX2NwdSA9IHhbaV07XG4gICAgICAgICAgcmF0aW8gPSAoeVtpICsgMV0gLSB5W2ldKSAvICh4W2kgKyAxXSAtIHhbaV0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBzdW0gb2YgYmFzZV9yYXRlICsgKGNwdSAtIGJhc2VfY3B1KSAqIHJhdGlvID0gdG90YWwgcmF0ZSBvZiBjcHUgdXNhZ2VcbiAgICAgIHdhdHRhZ2UgPSBiYXNlX3JhdGUgKyAoY3B1IC0gYmFzZV9jcHUpICogcmF0aW87XG4gICAgfVxuICAgIC8vICBkdXJhdGlvbiBpcyBpbiBzZWNvbmRzXG4gICAgLy8gIHdhdHRhZ2UgaXMgaW4gd2F0dHNcbiAgICAvLyAgZWc6IDMwVyB4IDMwMHMgPSA5MDAwIEpcbiAgICAvLyAgMSBXaCA9IDM2MDAgSlxuICAgIC8vICA5MDAwIEogLyAzNjAwID0gMi41IFdoXG4gICAgLy8gIEogLyAzNjAwID0gV2hcbiAgICAvLyAgMi41IFdoIC8gMTAwMCA9IDAuMDAyNSBrV2hcbiAgICAvLyAgV2ggLyAxMDAwID0ga1doXG4gICAgLy8gKHdhdHRhZ2UgKiBkdXJhdGlvbikgLyAoc2Vjb25kcyBpbiBhbiBob3VyKSAvIDEwMDAgPSBrV2hcbiAgICByZXR1cm4gKHdhdHRhZ2UgKiBkdXJhdGlvbikgLyAzNjAwIC8gMTAwMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBlbWJvZGllZCBlbWlzc2lvbnMgZm9yIGEgZ2l2ZW4gaW5wdXRcbiAgICovXG4gIHByaXZhdGUgZW1ib2RpZWRFbWlzc2lvbnMoaW5wdXQ6IEtleVZhbHVlUGFpcik6IG51bWJlciB7XG4gICAgLy8gZHVyYXRpb25cbiAgICBjb25zdCBkdXJhdGlvbkluSG91cnMgPSBpbnB1dFsnZHVyYXRpb24nXSAvIDM2MDA7XG4gICAgLy8gTSA9IFRFICogKFRSL0VMKSAqIChSUi9UUilcbiAgICAvLyBXaGVyZTpcbiAgICAvLyBURSA9IFRvdGFsIEVtYm9kaWVkIEVtaXNzaW9ucywgdGhlIHN1bSBvZiBMaWZlIEN5Y2xlIEFzc2Vzc21lbnQoTENBKSBlbWlzc2lvbnMgZm9yIGFsbCBoYXJkd2FyZSBjb21wb25lbnRzXG4gICAgLy8gVFIgPSBUaW1lIFJlc2VydmVkLCB0aGUgbGVuZ3RoIG9mIHRpbWUgdGhlIGhhcmR3YXJlIGlzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIHNvZnR3YXJlXG4gICAgLy8gRUwgPSBFeHBlY3RlZCBMaWZlc3BhbiwgdGhlIGFudGljaXBhdGVkIHRpbWUgdGhhdCB0aGUgZXF1aXBtZW50IHdpbGwgYmUgaW5zdGFsbGVkXG4gICAgLy8gUlIgPSBSZXNvdXJjZXMgUmVzZXJ2ZWQsIHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIHNvZnR3YXJlLlxuICAgIC8vIFRSID0gVG90YWwgUmVzb3VyY2VzLCB0aGUgdG90YWwgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUuXG4gICAgY29uc3QgdG90YWxFbWlzc2lvbnMgPVxuICAgICAgdGhpcy5jb21wdXRlSW5zdGFuY2VzW3RoaXMuaW5zdGFuY2VUeXBlXS5lbWJvZGllZEVtaXNzaW9uID8/IDA7XG4gICAgY29uc3QgdGltZVJlc2VydmVkID0gZHVyYXRpb25JbkhvdXJzO1xuICAgIGNvbnN0IGV4cGVjdGVkTGlmZXNwYW4gPSB0aGlzLmV4cGVjdGVkTGlmZXNwYW4gLyAzNjAwO1xuICAgIGNvbnN0IHJlc2VydmVkUmVzb3VyY2VzID1cbiAgICAgIHRoaXMuY29tcHV0ZUluc3RhbmNlc1t0aGlzLmluc3RhbmNlVHlwZV0udkNQVXMgPz8gMS4wO1xuICAgIGNvbnN0IHRvdGFsUmVzb3VyY2VzID1cbiAgICAgIHRoaXMuY29tcHV0ZUluc3RhbmNlc1t0aGlzLmluc3RhbmNlVHlwZV0ubWF4VkNQVXMgPz8gMS4wO1xuICAgIC8vIE11bHRpcGx5IHRvdGFsRW1pc3Npb25zIGJ5IDEwMDAgdG8gY29udmVydCBmcm9tIGtnQ08yZSB0byBnQ08yZVxuICAgIHJldHVybiAoXG4gICAgICB0b3RhbEVtaXNzaW9ucyAqXG4gICAgICAxMDAwICpcbiAgICAgICh0aW1lUmVzZXJ2ZWQgLyBleHBlY3RlZExpZmVzcGFuKSAqXG4gICAgICAocmVzZXJ2ZWRSZXNvdXJjZXMgLyB0b3RhbFJlc291cmNlcylcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { IOutputModelInterface } from '../interfaces';
|
|
2
|
+
import { Interpolation } from '../../types/common';
|
|
3
|
+
export declare class TeadsCurveModel implements IOutputModelInterface {
|
|
4
|
+
authParams: object | undefined;
|
|
5
|
+
name: string | undefined;
|
|
6
|
+
tdp: number;
|
|
7
|
+
curve: number[];
|
|
8
|
+
points: number[];
|
|
9
|
+
spline: any;
|
|
10
|
+
interpolation: Interpolation;
|
|
11
|
+
/**
|
|
12
|
+
* Defined for compatibility. Not used in TEADS.
|
|
13
|
+
*/
|
|
14
|
+
authenticate(authParams: object): void;
|
|
15
|
+
/**
|
|
16
|
+
* Configures the TEADS Plugin for IEF
|
|
17
|
+
* @param {string} name name of the resource
|
|
18
|
+
* @param {Object} staticParams static parameters for the resource
|
|
19
|
+
* @param {number} staticParams.tdp Thermal Design Power in Watts
|
|
20
|
+
* @param {Interpolation} staticParams.interpolation Interpolation method
|
|
21
|
+
*/
|
|
22
|
+
configure(name: string, staticParams?: object | undefined): Promise<IOutputModelInterface>;
|
|
23
|
+
/**
|
|
24
|
+
* Calculate the total emissions for a list of inputs
|
|
25
|
+
*
|
|
26
|
+
* Each input require:
|
|
27
|
+
* @param {Object[]} inputs
|
|
28
|
+
* @param {string} inputs[].timestamp RFC3339 timestamp string
|
|
29
|
+
* @param {number} inputs[].duration input duration in seconds
|
|
30
|
+
* @param {number} inputs[].cpu-util percentage cpu usage
|
|
31
|
+
*/
|
|
32
|
+
execute(inputs: object | object[] | undefined): Promise<any[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Returns model identifier
|
|
35
|
+
*/
|
|
36
|
+
modelIdentifier(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Calculates the energy consumption for a single input
|
|
39
|
+
* requires
|
|
40
|
+
*
|
|
41
|
+
* duration: duration of the input in seconds
|
|
42
|
+
* cpu-util: cpu usage in percentage
|
|
43
|
+
* timestamp: RFC3339 timestamp string
|
|
44
|
+
*
|
|
45
|
+
* Uses a spline method on the teads cpu wattage data
|
|
46
|
+
*/
|
|
47
|
+
private calculateEnergy;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* For JSII.
|
|
51
|
+
*/
|
|
52
|
+
export { KeyValuePair, Interpolation } from '../../types/common';
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Interpolation = exports.TeadsCurveModel = void 0;
|
|
4
|
+
const typescript_cubic_spline_1 = require("typescript-cubic-spline");
|
|
5
|
+
const config_1 = require("../../config");
|
|
6
|
+
const common_1 = require("../../types/common");
|
|
7
|
+
const { MODEL_IDS } = config_1.CONFIG;
|
|
8
|
+
const { TEADS_CURVE } = MODEL_IDS;
|
|
9
|
+
class TeadsCurveModel {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.tdp = 0; // `tdp` of the chip being measured.
|
|
12
|
+
this.curve = [0.12, 0.32, 0.75, 1.02]; // Default power curve provided by the Teads Team.
|
|
13
|
+
this.points = [0, 10, 50, 100]; // Default percentage points.
|
|
14
|
+
this.spline = new typescript_cubic_spline_1.default(this.points, this.curve); // Spline interpolation of the power curve.
|
|
15
|
+
this.interpolation = common_1.Interpolation.SPLINE; // Interpolation method.
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Defined for compatibility. Not used in TEADS.
|
|
19
|
+
*/
|
|
20
|
+
authenticate(authParams) {
|
|
21
|
+
this.authParams = authParams;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Configures the TEADS Plugin for IEF
|
|
25
|
+
* @param {string} name name of the resource
|
|
26
|
+
* @param {Object} staticParams static parameters for the resource
|
|
27
|
+
* @param {number} staticParams.tdp Thermal Design Power in Watts
|
|
28
|
+
* @param {Interpolation} staticParams.interpolation Interpolation method
|
|
29
|
+
*/
|
|
30
|
+
async configure(name, staticParams = undefined) {
|
|
31
|
+
this.name = name;
|
|
32
|
+
if (staticParams === undefined) {
|
|
33
|
+
throw new Error('Required Parameters not provided');
|
|
34
|
+
}
|
|
35
|
+
if ('thermal-design-power' in staticParams) {
|
|
36
|
+
this.tdp = staticParams['thermal-design-power'];
|
|
37
|
+
}
|
|
38
|
+
// if ('curve' in staticParams && 'points' in staticParams) {
|
|
39
|
+
// this.curve = staticParams?.curve as number[];
|
|
40
|
+
// this.points = staticParams?.points as number[];
|
|
41
|
+
// if (this.curve.length !== this.points.length) {
|
|
42
|
+
// throw new Error(
|
|
43
|
+
// 'Number of points and curve values must be the same length'
|
|
44
|
+
// );
|
|
45
|
+
// }
|
|
46
|
+
// this.spline = new Spline(this.points, this.curve);
|
|
47
|
+
// }
|
|
48
|
+
if ('interpolation' in staticParams) {
|
|
49
|
+
this.interpolation = staticParams?.interpolation;
|
|
50
|
+
}
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Calculate the total emissions for a list of inputs
|
|
55
|
+
*
|
|
56
|
+
* Each input require:
|
|
57
|
+
* @param {Object[]} inputs
|
|
58
|
+
* @param {string} inputs[].timestamp RFC3339 timestamp string
|
|
59
|
+
* @param {number} inputs[].duration input duration in seconds
|
|
60
|
+
* @param {number} inputs[].cpu-util percentage cpu usage
|
|
61
|
+
*/
|
|
62
|
+
async execute(inputs) {
|
|
63
|
+
if (inputs === undefined) {
|
|
64
|
+
throw new Error('Required Parameters not provided');
|
|
65
|
+
}
|
|
66
|
+
else if (!Array.isArray(inputs)) {
|
|
67
|
+
throw new Error('inputs must be an array');
|
|
68
|
+
}
|
|
69
|
+
return inputs.map((input) => {
|
|
70
|
+
this.configure(this.name, input);
|
|
71
|
+
input['energy-cpu'] = this.calculateEnergy(input);
|
|
72
|
+
return input;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Returns model identifier
|
|
77
|
+
*/
|
|
78
|
+
modelIdentifier() {
|
|
79
|
+
return TEADS_CURVE;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Calculates the energy consumption for a single input
|
|
83
|
+
* requires
|
|
84
|
+
*
|
|
85
|
+
* duration: duration of the input in seconds
|
|
86
|
+
* cpu-util: cpu usage in percentage
|
|
87
|
+
* timestamp: RFC3339 timestamp string
|
|
88
|
+
*
|
|
89
|
+
* Uses a spline method on the teads cpu wattage data
|
|
90
|
+
*/
|
|
91
|
+
calculateEnergy(input) {
|
|
92
|
+
if (!('duration' in input) ||
|
|
93
|
+
!('cpu-util' in input) ||
|
|
94
|
+
!('timestamp' in input)) {
|
|
95
|
+
throw new Error('Required Parameters duration,cpu-util,timestamp not provided for input');
|
|
96
|
+
}
|
|
97
|
+
// duration is in seconds
|
|
98
|
+
const duration = input['duration'];
|
|
99
|
+
// convert cpu usage to percentage
|
|
100
|
+
const cpu = input['cpu-util'];
|
|
101
|
+
if (cpu < 0 || cpu > 100) {
|
|
102
|
+
throw new Error('cpu usage must be between 0 and 100');
|
|
103
|
+
}
|
|
104
|
+
let tdp = this.tdp;
|
|
105
|
+
if ('thermal-design-power' in input) {
|
|
106
|
+
tdp = input['thermal-design-power'];
|
|
107
|
+
}
|
|
108
|
+
if (tdp === 0) {
|
|
109
|
+
throw new Error('`thermal-design-power` not provided. Can not compute energy.');
|
|
110
|
+
}
|
|
111
|
+
let wattage = 0.0;
|
|
112
|
+
if (this.interpolation === common_1.Interpolation.SPLINE) {
|
|
113
|
+
wattage = this.spline.at(cpu) * tdp;
|
|
114
|
+
}
|
|
115
|
+
else if (this.interpolation === common_1.Interpolation.LINEAR) {
|
|
116
|
+
const x = this.points;
|
|
117
|
+
const y = this.curve;
|
|
118
|
+
// base rate is from which level of cpu linear interpolation is applied at
|
|
119
|
+
let base_rate = 0;
|
|
120
|
+
let base_cpu = 0;
|
|
121
|
+
let ratio = 0;
|
|
122
|
+
// find the base rate and ratio
|
|
123
|
+
for (let i = 0; i < x.length; i++) {
|
|
124
|
+
if (cpu === x[i]) {
|
|
125
|
+
base_rate = y[i];
|
|
126
|
+
base_cpu = x[i];
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
else if (cpu > x[i] && cpu < x[i + 1]) {
|
|
130
|
+
base_rate = y[i];
|
|
131
|
+
base_cpu = x[i];
|
|
132
|
+
ratio = (y[i + 1] - y[i]) / (x[i + 1] - x[i]);
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// sum of base_rate + (cpu - base_cpu) * ratio = total rate of cpu usage
|
|
137
|
+
// total rate * tdp = wattage
|
|
138
|
+
wattage = (base_rate + (cpu - base_cpu) * ratio) * tdp;
|
|
139
|
+
}
|
|
140
|
+
// duration is in seconds
|
|
141
|
+
// wattage is in watts
|
|
142
|
+
// eg: 30W x 300s = 9000 J
|
|
143
|
+
// 1 Wh = 3600 J
|
|
144
|
+
// 9000 J / 3600 = 2.5 Wh
|
|
145
|
+
// J / 3600 = Wh
|
|
146
|
+
// 2.5 Wh / 1000 = 0.0025 kWh
|
|
147
|
+
// Wh / 1000 = kWh
|
|
148
|
+
// (wattage * duration) / (seconds in an hour) / 1000 = kWh
|
|
149
|
+
return (wattage * duration) / 3600 / 1000;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.TeadsCurveModel = TeadsCurveModel;
|
|
153
|
+
/**
|
|
154
|
+
* For JSII.
|
|
155
|
+
*/
|
|
156
|
+
var common_2 = require("../../types/common");
|
|
157
|
+
Object.defineProperty(exports, "Interpolation", { enumerable: true, get: function () { return common_2.Interpolation; } });
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RlYWRzLWN1cnZlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE2QztBQUk3Qyx5Q0FBb0M7QUFFcEMsK0NBQStEO0FBRS9ELE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFDM0IsTUFBTSxFQUFDLFdBQVcsRUFBQyxHQUFHLFNBQVMsQ0FBQztBQUVoQyxNQUFhLGVBQWU7SUFBNUI7UUFHRSxRQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsb0NBQW9DO1FBQzdDLFVBQUssR0FBYSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsa0RBQWtEO1FBQzlGLFdBQU0sR0FBYSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO1FBQ2xFLFdBQU0sR0FBUSxJQUFJLGlDQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7UUFDOUYsa0JBQWEsR0FBa0Isc0JBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyx3QkFBd0I7SUE0Si9FLENBQUM7SUExSkM7O09BRUc7SUFDSCxZQUFZLENBQUMsVUFBa0I7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ2IsSUFBWSxFQUNaLGVBQW1DLFNBQVM7UUFFNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFakIsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksc0JBQXNCLElBQUksWUFBWSxFQUFF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QUFHLElBQUksQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUFuS0QsMENBbUtDO0FBRUQ7O0dBRUc7QUFDSCw2Q0FBK0Q7QUFBekMsdUdBQUEsYUFBYSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNwbGluZSBmcm9tICd0eXBlc2NyaXB0LWN1YmljLXNwbGluZSc7XG5cbmltcG9ydCB7SU91dHB1dE1vZGVsSW50ZXJmYWNlfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuaW1wb3J0IHtDT05GSUd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5cbmltcG9ydCB7S2V5VmFsdWVQYWlyLCBJbnRlcnBvbGF0aW9ufSBmcm9tICcuLi8uLi90eXBlcy9jb21tb24nO1xuXG5jb25zdCB7TU9ERUxfSURTfSA9IENPTkZJRztcbmNvbnN0IHtURUFEU19DVVJWRX0gPSBNT0RFTF9JRFM7XG5cbmV4cG9ydCBjbGFzcyBUZWFkc0N1cnZlTW9kZWwgaW1wbGVtZW50cyBJT3V0cHV0TW9kZWxJbnRlcmZhY2Uge1xuICBhdXRoUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQ7IC8vIERlZmluZWQgZm9yIGNvbXBhdGliaWxpdHkuIE5vdCB1c2VkIGluIFRFQURTLlxuICBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7IC8vIE5hbWUgb2YgdGhlIGRhdGEgc291cmNlLlxuICB0ZHAgPSAwOyAvLyBgdGRwYCBvZiB0aGUgY2hpcCBiZWluZyBtZWFzdXJlZC5cbiAgY3VydmU6IG51bWJlcltdID0gWzAuMTIsIDAuMzIsIDAuNzUsIDEuMDJdOyAvLyBEZWZhdWx0IHBvd2VyIGN1cnZlIHByb3ZpZGVkIGJ5IHRoZSBUZWFkcyBUZWFtLlxuICBwb2ludHM6IG51bWJlcltdID0gWzAsIDEwLCA1MCwgMTAwXTsgLy8gRGVmYXVsdCBwZXJjZW50YWdlIHBvaW50cy5cbiAgc3BsaW5lOiBhbnkgPSBuZXcgU3BsaW5lKHRoaXMucG9pbnRzLCB0aGlzLmN1cnZlKTsgLy8gU3BsaW5lIGludGVycG9sYXRpb24gb2YgdGhlIHBvd2VyIGN1cnZlLlxuICBpbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0aW9uID0gSW50ZXJwb2xhdGlvbi5TUExJTkU7IC8vIEludGVycG9sYXRpb24gbWV0aG9kLlxuXG4gIC8qKlxuICAgKiBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZCBpbiBURUFEUy5cbiAgICovXG4gIGF1dGhlbnRpY2F0ZShhdXRoUGFyYW1zOiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGhQYXJhbXMgPSBhdXRoUGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIFRFQURTIFBsdWdpbiBmb3IgSUVGXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0aWNQYXJhbXMgc3RhdGljIHBhcmFtZXRlcnMgZm9yIHRoZSByZXNvdXJjZVxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdGljUGFyYW1zLnRkcCBUaGVybWFsIERlc2lnbiBQb3dlciBpbiBXYXR0c1xuICAgKiBAcGFyYW0ge0ludGVycG9sYXRpb259IHN0YXRpY1BhcmFtcy5pbnRlcnBvbGF0aW9uIEludGVycG9sYXRpb24gbWV0aG9kXG4gICAqL1xuICBhc3luYyBjb25maWd1cmUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YXRpY1BhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG4gICk6IFByb21pc2U8SU91dHB1dE1vZGVsSW50ZXJmYWNlPiB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcblxuICAgIGlmIChzdGF0aWNQYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBQYXJhbWV0ZXJzIG5vdCBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGlmICgndGhlcm1hbC1kZXNpZ24tcG93ZXInIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy50ZHAgPSBzdGF0aWNQYXJhbXNbJ3RoZXJtYWwtZGVzaWduLXBvd2VyJ10gYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIC8vIGlmICgnY3VydmUnIGluIHN0YXRpY1BhcmFtcyAmJiAncG9pbnRzJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAvLyAgIHRoaXMuY3VydmUgPSBzdGF0aWNQYXJhbXM/LmN1cnZlIGFzIG51bWJlcltdO1xuICAgIC8vICAgdGhpcy5wb2ludHMgPSBzdGF0aWNQYXJhbXM/LnBvaW50cyBhcyBudW1iZXJbXTtcbiAgICAvLyAgIGlmICh0aGlzLmN1cnZlLmxlbmd0aCAhPT0gdGhpcy5wb2ludHMubGVuZ3RoKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAvLyAgICAgICAnTnVtYmVyIG9mIHBvaW50cyBhbmQgY3VydmUgdmFsdWVzIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoJ1xuICAgIC8vICAgICApO1xuICAgIC8vICAgfVxuICAgIC8vICAgdGhpcy5zcGxpbmUgPSBuZXcgU3BsaW5lKHRoaXMucG9pbnRzLCB0aGlzLmN1cnZlKTtcbiAgICAvLyB9XG5cbiAgICBpZiAoJ2ludGVycG9sYXRpb24nIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uID0gc3RhdGljUGFyYW1zPy5pbnRlcnBvbGF0aW9uIGFzIEludGVycG9sYXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSB0b3RhbCBlbWlzc2lvbnMgZm9yIGEgbGlzdCBvZiBpbnB1dHNcbiAgICpcbiAgICogRWFjaCBpbnB1dCByZXF1aXJlOlxuICAgKiBAcGFyYW0ge09iamVjdFtdfSBpbnB1dHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0c1tdLnRpbWVzdGFtcCBSRkMzMzM5IHRpbWVzdGFtcCBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlucHV0c1tdLmR1cmF0aW9uIGlucHV0IGR1cmF0aW9uIGluIHNlY29uZHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlucHV0c1tdLmNwdS11dGlsIHBlcmNlbnRhZ2UgY3B1IHVzYWdlXG4gICAqL1xuICBhc3luYyBleGVjdXRlKGlucHV0czogb2JqZWN0IHwgb2JqZWN0W10gfCB1bmRlZmluZWQpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgaWYgKGlucHV0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIFBhcmFtZXRlcnMgbm90IHByb3ZpZGVkJyk7XG4gICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShpbnB1dHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lucHV0cyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHMubWFwKChpbnB1dDogS2V5VmFsdWVQYWlyKSA9PiB7XG4gICAgICB0aGlzLmNvbmZpZ3VyZSh0aGlzLm5hbWUhLCBpbnB1dCk7XG4gICAgICBpbnB1dFsnZW5lcmd5LWNwdSddID0gdGhpcy5jYWxjdWxhdGVFbmVyZ3koaW5wdXQpO1xuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbW9kZWwgaWRlbnRpZmllclxuICAgKi9cbiAgbW9kZWxJZGVudGlmaWVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFRFQURTX0NVUlZFO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGVuZXJneSBjb25zdW1wdGlvbiBmb3IgYSBzaW5nbGUgaW5wdXRcbiAgICogcmVxdWlyZXNcbiAgICpcbiAgICogZHVyYXRpb246IGR1cmF0aW9uIG9mIHRoZSBpbnB1dCBpbiBzZWNvbmRzXG4gICAqIGNwdS11dGlsOiBjcHUgdXNhZ2UgaW4gcGVyY2VudGFnZVxuICAgKiB0aW1lc3RhbXA6IFJGQzMzMzkgdGltZXN0YW1wIHN0cmluZ1xuICAgKlxuICAgKiBVc2VzIGEgc3BsaW5lIG1ldGhvZCBvbiB0aGUgdGVhZHMgY3B1IHdhdHRhZ2UgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVFbmVyZ3koaW5wdXQ6IEtleVZhbHVlUGFpcikge1xuICAgIGlmIChcbiAgICAgICEoJ2R1cmF0aW9uJyBpbiBpbnB1dCkgfHxcbiAgICAgICEoJ2NwdS11dGlsJyBpbiBpbnB1dCkgfHxcbiAgICAgICEoJ3RpbWVzdGFtcCcgaW4gaW5wdXQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdSZXF1aXJlZCBQYXJhbWV0ZXJzIGR1cmF0aW9uLGNwdS11dGlsLHRpbWVzdGFtcCBub3QgcHJvdmlkZWQgZm9yIGlucHV0J1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAgICBkdXJhdGlvbiBpcyBpbiBzZWNvbmRzXG4gICAgY29uc3QgZHVyYXRpb24gPSBpbnB1dFsnZHVyYXRpb24nXTtcblxuICAgIC8vICAgIGNvbnZlcnQgY3B1IHVzYWdlIHRvIHBlcmNlbnRhZ2VcbiAgICBjb25zdCBjcHUgPSBpbnB1dFsnY3B1LXV0aWwnXTtcbiAgICBpZiAoY3B1IDwgMCB8fCBjcHUgPiAxMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3B1IHVzYWdlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAnKTtcbiAgICB9XG5cbiAgICBsZXQgdGRwID0gdGhpcy50ZHA7XG5cbiAgICBpZiAoJ3RoZXJtYWwtZGVzaWduLXBvd2VyJyBpbiBpbnB1dCkge1xuICAgICAgdGRwID0gaW5wdXRbJ3RoZXJtYWwtZGVzaWduLXBvd2VyJ10gYXMgbnVtYmVyO1xuICAgIH1cbiAgICBpZiAodGRwID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdgdGhlcm1hbC1kZXNpZ24tcG93ZXJgIG5vdCBwcm92aWRlZC4gQ2FuIG5vdCBjb21wdXRlIGVuZXJneS4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCB3YXR0YWdlID0gMC4wO1xuICAgIGlmICh0aGlzLmludGVycG9sYXRpb24gPT09IEludGVycG9sYXRpb24uU1BMSU5FKSB7XG4gICAgICB3YXR0YWdlID0gdGhpcy5zcGxpbmUuYXQoY3B1KSAqIHRkcDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW50ZXJwb2xhdGlvbiA9PT0gSW50ZXJwb2xhdGlvbi5MSU5FQVIpIHtcbiAgICAgIGNvbnN0IHggPSB0aGlzLnBvaW50cztcbiAgICAgIGNvbnN0IHkgPSB0aGlzLmN1cnZlO1xuICAgICAgLy8gYmFzZSByYXRlIGlzIGZyb20gd2hpY2ggbGV2ZWwgb2YgY3B1IGxpbmVhciBpbnRlcnBvbGF0aW9uIGlzIGFwcGxpZWQgYXRcbiAgICAgIGxldCBiYXNlX3JhdGUgPSAwO1xuICAgICAgbGV0IGJhc2VfY3B1ID0gMDtcbiAgICAgIGxldCByYXRpbyA9IDA7XG4gICAgICAvLyBmaW5kIHRoZSBiYXNlIHJhdGUgYW5kIHJhdGlvXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNwdSA9PT0geFtpXSkge1xuICAgICAgICAgIGJhc2VfcmF0ZSA9IHlbaV07XG4gICAgICAgICAgYmFzZV9jcHUgPSB4W2ldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKGNwdSA+IHhbaV0gJiYgY3B1IDwgeFtpICsgMV0pIHtcbiAgICAgICAgICBiYXNlX3JhdGUgPSB5W2ldO1xuICAgICAgICAgIGJhc2VfY3B1ID0geFtpXTtcbiAgICAgICAgICByYXRpbyA9ICh5W2kgKyAxXSAtIHlbaV0pIC8gKHhbaSArIDFdIC0geFtpXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHN1bSBvZiBiYXNlX3JhdGUgKyAoY3B1IC0gYmFzZV9jcHUpICogcmF0aW8gPSB0b3RhbCByYXRlIG9mIGNwdSB1c2FnZVxuICAgICAgLy8gdG90YWwgcmF0ZSAqIHRkcCA9IHdhdHRhZ2VcbiAgICAgIHdhdHRhZ2UgPSAoYmFzZV9yYXRlICsgKGNwdSAtIGJhc2VfY3B1KSAqIHJhdGlvKSAqIHRkcDtcbiAgICB9XG4gICAgLy8gIGR1cmF0aW9uIGlzIGluIHNlY29uZHNcbiAgICAvLyAgd2F0dGFnZSBpcyBpbiB3YXR0c1xuICAgIC8vICBlZzogMzBXIHggMzAwcyA9IDkwMDAgSlxuICAgIC8vICAxIFdoID0gMzYwMCBKXG4gICAgLy8gIDkwMDAgSiAvIDM2MDAgPSAyLjUgV2hcbiAgICAvLyAgSiAvIDM2MDAgPSBXaFxuICAgIC8vICAyLjUgV2ggLyAxMDAwID0gMC4wMDI1IGtXaFxuICAgIC8vICBXaCAvIDEwMDAgPSBrV2hcbiAgICAvLyAod2F0dGFnZSAqIGR1cmF0aW9uKSAvIChzZWNvbmRzIGluIGFuIGhvdXIpIC8gMTAwMCA9IGtXaFxuICAgIHJldHVybiAod2F0dGFnZSAqIGR1cmF0aW9uKSAvIDM2MDAgLyAxMDAwO1xuICB9XG59XG5cbi8qKlxuICogRm9yIEpTSUkuXG4gKi9cbmV4cG9ydCB7S2V5VmFsdWVQYWlyLCBJbnRlcnBvbGF0aW9ufSBmcm9tICcuLi8uLi90eXBlcy9jb21tb24nO1xuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { IOutputModelInterface } from '../interfaces';
|
|
2
|
+
import { KeyValuePair } from '../../types/common';
|
|
3
|
+
export declare class WattTimeGridEmissions implements IOutputModelInterface {
|
|
4
|
+
authParams: object | undefined;
|
|
5
|
+
token: string;
|
|
6
|
+
staticParams: object | undefined;
|
|
7
|
+
name: string | undefined;
|
|
8
|
+
baseUrl: string;
|
|
9
|
+
authenticate(authParams: object): Promise<void>;
|
|
10
|
+
execute(inputs: object | object[] | undefined): Promise<any[]>;
|
|
11
|
+
private getWattTimeDataForDuration;
|
|
12
|
+
private validateinputs;
|
|
13
|
+
private getLatitudeLongitudeFrominput;
|
|
14
|
+
private determineinputStartEnd;
|
|
15
|
+
fetchData(input: KeyValuePair): Promise<KeyValuePair[]>;
|
|
16
|
+
configure(name: string, staticParams: object | undefined): Promise<IOutputModelInterface>;
|
|
17
|
+
modelIdentifier(): string;
|
|
18
|
+
}
|