@grnsft/if 0.3.4 → 0.4.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/.commitlintrc.js +0 -1
  2. package/.lintstagedrc.js +6 -0
  3. package/README.md +12 -8
  4. package/Refactor-migration-guide.md +6 -6
  5. package/github-processes.md +16 -42
  6. package/manifests/bugs/aggregation-error-wrong-metric.yml +6 -6
  7. package/manifests/bugs/azure-importer-ignoring-defaults.yml +3 -3
  8. package/manifests/bugs/azure-importer-incorrect-calculation.yml +2 -2
  9. package/manifests/bugs/mock-observations-failure-duration-is-zero.yml +34 -0
  10. package/manifests/bugs/pipeline-error-uninitialized-plugin.yml +1 -1
  11. package/manifests/bugs/pipeline-ordering-error.yml +6 -6
  12. package/manifests/bugs/sci-embodied-missing-resources-total.yml +23 -0
  13. package/manifests/examples/generics.yml +3 -3
  14. package/manifests/examples/instance-metadata.yml +36 -0
  15. package/manifests/examples/mock-cpu-util-to-carbon.yml +3 -3
  16. package/manifests/examples/nesting.yml +37 -10
  17. package/manifests/examples/pipeline-teads-sci.yml +17 -9
  18. package/manifests/examples/pipeline-with-aggregate.yml +24 -9
  19. package/manifests/examples/pipeline-with-mocks.yml +26 -9
  20. package/manifests/examples/sci.yml +131 -0
  21. package/manifests/examples/teads-curve.yml +78 -0
  22. package/manifests/features/aggregate-failure-inalid-metrics.yml +43 -0
  23. package/manifests/features/aggregate-failure-missing-metric-in-inputs.yml +43 -0
  24. package/manifests/integrations/cloud-metadata-divide-boavizta.yml +1 -1
  25. package/manifests/integrations/mock-obs-group-by-cloud-meta.yml +51 -0
  26. package/manifests/integrations/mock-obs-groupby.yml +2 -2
  27. package/manifests/integrations/mock-obs-time-sync.yml +1 -1
  28. package/manifests/plugins/cloud-metadata/failure-invalid-instance-type.yaml +21 -0
  29. package/manifests/plugins/cloud-metadata/failure-invalid-vendor.yaml +1 -1
  30. package/manifests/plugins/cloud-metadata/failure-missing-cloud-vendor.yml +21 -0
  31. package/manifests/plugins/cloud-metadata/success.yml +1 -1
  32. package/manifests/plugins/coefficient/failure-invalid-config-input-param.yml +1 -1
  33. package/manifests/plugins/coefficient/failure-output-param-is-null.yaml +24 -0
  34. package/manifests/plugins/coefficient/success.yml +1 -1
  35. package/manifests/plugins/csv-lookup/failure-missing-column.yml +26 -0
  36. package/manifests/plugins/csv-lookup/failure-missing-output.yml +26 -0
  37. package/manifests/plugins/csv-lookup/success-renaming.yml +26 -0
  38. package/manifests/plugins/csv-lookup/success.yml +26 -0
  39. package/manifests/plugins/divide/failure-denominator-equal-zero.yml +39 -0
  40. package/manifests/plugins/divide/failure-invalid-config-denominator.yml +1 -1
  41. package/manifests/plugins/divide/failure-missing-numerator.yml +39 -0
  42. package/manifests/plugins/divide/success.yml +2 -2
  43. package/manifests/plugins/groupby/failure-missing-cloud-instance-type.yml +49 -0
  44. package/manifests/plugins/interpolation/interpolation.yml +24 -0
  45. package/manifests/plugins/mock-observations/failure-invalid-config-cpu-range.yml +1 -1
  46. package/manifests/plugins/mock-observations/failure-invalid-memory-utilization-range.yml +34 -0
  47. package/manifests/plugins/mock-observations/failure-missing-timestamp-from-param.yml +34 -0
  48. package/manifests/plugins/mock-observations/success.yml +2 -2
  49. package/manifests/plugins/multiply/failure-input-parameter-is-missing.yml +1 -1
  50. package/manifests/plugins/multiply/success-with-multiple-inputs.yml +32 -0
  51. package/manifests/plugins/multiply/success.yml +3 -3
  52. package/manifests/plugins/regex/failure-missing-input-param.yml +1 -1
  53. package/manifests/plugins/regex/failure-not-matching-with-regex.yml +24 -0
  54. package/manifests/plugins/regex/success.yml +2 -2
  55. package/manifests/plugins/sci/failure-invalid-config-value.yml +2 -3
  56. package/manifests/plugins/sci/failure-missing-input-param.yml +27 -0
  57. package/manifests/plugins/sci/success.yml +5 -4
  58. package/manifests/plugins/{sci-m → sci-embodied}/failure-invalid-default-emission-value.yml +5 -6
  59. package/manifests/plugins/sci-embodied/failure-missing-expected-lifespan.yml +23 -0
  60. package/manifests/plugins/{sci-m → sci-embodied}/success.yml +5 -6
  61. package/manifests/plugins/shell/failure-invalid-command.yml +1 -1
  62. package/manifests/plugins/shell/success.yml +1 -2
  63. package/manifests/plugins/sum/failure-missing-input-param.yml +1 -1
  64. package/manifests/plugins/sum/failure-missing-output-param.yml +28 -0
  65. package/manifests/plugins/sum/success.yml +1 -1
  66. package/manifests/plugins/tdp-finder/failure-unsupported-physical-processor.yml +19 -0
  67. package/manifests/plugins/time-sync/failure-missing-global-config.yml +34 -0
  68. package/package.json +10 -2
  69. package/src/builtins/README.md +5 -5
  70. package/src/builtins/coefficient/README.md +92 -0
  71. package/src/builtins/csv-lookup/README.md +142 -0
  72. package/src/builtins/divide/README.md +95 -0
  73. package/src/builtins/exponent/README.md +97 -0
  74. package/src/builtins/interpolation/README.md +168 -0
  75. package/src/builtins/mock-observations/README.md +97 -0
  76. package/src/builtins/multiply/README.md +94 -0
  77. package/src/builtins/regex/README.md +91 -0
  78. package/src/builtins/sci/README.md +89 -0
  79. package/src/builtins/sci-embodied/README.md +110 -0
  80. package/src/builtins/shell/README.md +130 -0
  81. package/src/builtins/subtract/README.md +94 -0
  82. package/src/builtins/sum/README.md +91 -0
@@ -0,0 +1,97 @@
1
+ # Exponent
2
+
3
+ `exponent` is a generic plugin for calculating exponent of an input param (as base) and another (as the exponent) in an `input` array.
4
+
5
+ You provide the names of the values you want to use for the exponent calculation, and a name to use to add the exponent result to the output array.
6
+
7
+ For example, you use `cpu/energy` as base and `network/energy` as and name the result `energy`. `energy` would then be added to every observation in your input array as `cpu/energy` raised by the exponent `network/energy`.
8
+
9
+ ## Parameters
10
+
11
+ ### Plugin config
12
+
13
+ Three parameters are required in global config: `input-parameter`, `exponent` and `output-parameter`.
14
+
15
+ `input-parameter`: a string defining the base. Must match an existing key in the `inputs` array
16
+ `exponent`: a number defining the exponent.
17
+ `output-parameter`: a string defining the name to use to add the result of the exponent to the output array.
18
+
19
+ ### Inputs
20
+
21
+ `input-parameter` and `exponent` must be available in the input array.
22
+
23
+ ## Returns
24
+
25
+ - `output-parameter`: `input-parameter` raised by `exponent` with the parameter name defined by `output-parameter` in global config.
26
+
27
+ ## Calculation
28
+
29
+ ```pseudocode
30
+ output = input ^ exponent
31
+ ```
32
+
33
+ ## Implementation
34
+
35
+ To run the plugin, you must first create an instance of `Exponent`. Then, you can call `execute()`.
36
+
37
+ ```typescript
38
+ import {Exponent} from 'builtins';
39
+
40
+ const config = {
41
+ inputParameter: ['cpu/energy'],
42
+ exponent: 2
43
+ outputParameter: 'energy',
44
+ };
45
+
46
+ const exponent = Exponent(config);
47
+ const result = await exponent.execute([
48
+ {
49
+ duration: 3600,
50
+ timestamp: '2021-01-01T00:00:00Z',
51
+ 'cpu/energy': 0.1,
52
+ 'energy': 0.01,
53
+ },
54
+ ]);
55
+ ```
56
+
57
+ ## Example manifest
58
+
59
+ IF users will typically call the plugin as part of a pipeline defined in a manifest file. In this case, instantiating the plugin is handled by and does not have to be done explicitly by the user. The following is an example manifest that calls `exponent`:
60
+
61
+ ```yaml
62
+ name: exponent demo
63
+ description:
64
+ tags:
65
+ initialize:
66
+ outputs:
67
+ - yaml
68
+ plugins:
69
+ exponent:
70
+ method: Exponent
71
+ path: 'builtin'
72
+ global-config:
73
+ input-parameter: 'cpu/energy'
74
+ exponent: 2
75
+ output-parameter: 'energy'
76
+ tree:
77
+ children:
78
+ child:
79
+ pipeline:
80
+ - exponent
81
+ config:
82
+ exponent:
83
+ inputs:
84
+ - timestamp: 2023-08-06T00:00
85
+ duration: 3600
86
+ cpu/energy: 0.001
87
+ network/energy: 0.001
88
+ ```
89
+
90
+ You can run this example by saving it as `manifests/examples/test/exponent.yml` and executing the following command from the project root:
91
+
92
+ ```sh
93
+ npm i -g @grnsft/if
94
+ ie --manifest manifests/examples/test/exponent.yml --output manifests/outputs/exponent.yml
95
+ ```
96
+
97
+ The results will be saved to a new `yaml` file in `manifests/outputs`.
@@ -0,0 +1,168 @@
1
+ # Interpolation Plugin
2
+
3
+ ## Overview
4
+
5
+ Interpolation is a way to infer new data points from a previously known set of points.
6
+ This plugin provides the `y` value at a given `x` by interpolating between known points. You provide a set of known `x`s and `y`s and a target `x`, the plugin returns the `y` for your `x`.
7
+
8
+ ## Usage
9
+
10
+ To employ the `Interpolation` plugin, adhere to these steps:
11
+
12
+ 1. **Initialize Plugin**: Import the `Interpolation` function and initialize it with global configuration parameters `method`, `x`, `y`, `input-parameter` and `output-parameter`.
13
+
14
+ 2. **Execute Plugin**: Invoke the `execute` method of the initialized plugin instance with an array of input parameters. Each input parameter should include a `timestamp`, `duration` and `[input-parameter]` information.
15
+
16
+ 3. **Result**: The plugin will return an array of plugin parameters enriched with the calculated average carbon intensity for each input.
17
+
18
+ ## Global Config
19
+
20
+ - `method`: specifies the interpolation method for the data. Acceptable values are 'linear', 'spline', or 'polynomial'. The default method is linear. (optional)
21
+ - `x`: array of x points. Numbers should be in ascending order (required).
22
+ - `y`: array of y points. Numbers should be in ascending order (required).
23
+ - `input-parameter`: a string defining the name to use its value to calculate the interpolation. It should match an existing key in the inputs array (required).
24
+ - `output-parameter`: a string defining the name to use to add the result of interpolation with additional calculation (required).
25
+
26
+ `x` and `y` arrays must be equal lengths.
27
+
28
+ ## Input Parameters
29
+
30
+ The plugin expects the following input parameters:
31
+
32
+ - `timestamp`: a timestamp for the input (required)
33
+ - `duration`: the amount of time, in seconds, that the input covers. (required)
34
+ - `[input-parameter]` - a field whose name matches the string provided to input-parameter in global config (i.e. if the input-parameter in global config is cpu/utilisation then cpu-utilisation must exist in the input data)
35
+
36
+ ## Output
37
+
38
+ The plugin outputs a value `z` that is the result of looking up the `y` value at `x = 'input-parameter'` using the user-defined interpolation method in `kWh` units. `z` is assigned to a field with a name defined by `output-parameter` in the output data.
39
+
40
+ ## Error Handling
41
+
42
+ The plugin conducts input validation using the `zod` library and may throw errors if the provided parameters are invalid.
43
+
44
+ ## Plugin Algorithm
45
+
46
+ 1. **Execution**:
47
+
48
+ - Validate Global config
49
+
50
+ - `method` - validates if the method is one of these methods: `linear`, `spline`, or `polynomial`. If the method isn’t provided, it sets to `linear`.
51
+ - `x` and `y` should be arrays of numbers, the length should be equal, and elements should be ordered in the ascendant order.
52
+ - `input-parameter` - validates if the parameter is string.
53
+ - `output-parameter` - validates if the parameter is string.
54
+
55
+ - Iterate through each input, and do corresponding validation and calculation.
56
+
57
+ - Validate input parameters
58
+
59
+ - `duration` - validate if the duration is a number
60
+ - `timestamp` - should be in string or date format
61
+ - `[input-parameter]` - validates whether the parameter name is included in the input, and if its value should be a number within the range of x points.
62
+
63
+ - Calculation
64
+
65
+ - If the `method` is provided, choose the right way to calculate. For the `linear` and `polynomial` methods, calculate according to their formulas. For spline interpolation, use the npm module `typescript-cubic-spline`.
66
+
67
+ 2. **Output**: Output the provided input along with the calculated `cpu/energy`
68
+
69
+ ### TypeScript Usage
70
+
71
+ ```ts
72
+ const globalConfig = {
73
+ method: 'linear',
74
+ x: [0, 10, 50, 100],
75
+ y: [0.12, 0.32, 0.75, 1.02],
76
+ 'input-parameter': 'cpu/utilization'
77
+ 'output-parameter': 'cpu/energy'
78
+
79
+ };
80
+
81
+ const interpolationPlugin = Interpolation(globalConfig);
82
+
83
+ const inputs = [
84
+ {
85
+ timestamp: '2024-04-16T12:00:00Z',
86
+ duration: 3600,
87
+ 'cpu/utilization': 45
88
+ },
89
+ ];
90
+
91
+ const results = interpolationPlugin.execute(inputs);
92
+
93
+ console.log(results);
94
+ ```
95
+
96
+ ### Manifest Usage
97
+
98
+ #### Input
99
+
100
+ ```yaml
101
+ name: interpolation-demo
102
+ description: simple demo of interpolation plugin
103
+ tags:
104
+ initialize:
105
+ outputs:
106
+ - yaml
107
+ plugins:
108
+ interpolation:
109
+ method: Interpolation
110
+ path: 'builtin'
111
+ global-config:
112
+ method: linear
113
+ x: [0, 10, 50, 100]
114
+ y: [0.12, 0.32, 0.75, 1.02]
115
+ input-parameter: 'cpu/utilization'
116
+ output-parameter: 'cpu/energy'
117
+ tree:
118
+ children:
119
+ child:
120
+ pipeline:
121
+ - interpolation
122
+ inputs:
123
+ - timestamp: 2023-07-06T00:00
124
+ duration: 3600
125
+ cpu/utilization: 45
126
+ ```
127
+
128
+ #### Output
129
+
130
+ ```yaml
131
+ name: interpolation-demo
132
+ description: simple demo of interpolation plugin
133
+ tags:
134
+ initialize:
135
+ outputs:
136
+ - yaml
137
+ plugins:
138
+ interpolation:
139
+ method: Interpolation
140
+ path: 'builtin'
141
+ global-config:
142
+ method: linear
143
+ x: [0, 10, 50, 100]
144
+ y: [0.12, 0.32, 0.75, 1.02]
145
+ input-parameter: 'cpu/utilization'
146
+ output-parameter: 'cpu/energy'
147
+ tree:
148
+ children:
149
+ child:
150
+ pipeline:
151
+ - interpolation
152
+ inputs:
153
+ - timestamp: 2023-07-06T00:00
154
+ duration: 3600
155
+ cpu/utilization: 45
156
+ outputs:
157
+ - timestamp: 2023-07-06T00:00
158
+ duration: 3600
159
+ cpu/utilization: 45
160
+ cpu/energy: 0.00069625
161
+ ```
162
+
163
+ You can execute this by passing it to `ie`. Run the impact using the following command from the project root:
164
+
165
+ ```sh
166
+ npm i -g @grnsft/if
167
+ ie --manifest ./manifests/examples/interpolation.yml --output ./manifests/outputs/interpolation.yml
168
+ ```
@@ -0,0 +1,97 @@
1
+ # Mock Observations Plugin
2
+
3
+ ## Introduction
4
+
5
+ A plugin for mocking observations (inputs) for testing and demo purposes
6
+
7
+ ## Scope
8
+
9
+ The mode currently mocks 2 types of observation data:
10
+
11
+ - Common key-value pairs, that are generated statically and are the same for each generated observation/input (see 'helpers/CommonGenerator.ts')
12
+ - Randomly generated integer values for predefined keys (see 'helpers/RandIntGenerator.ts')
13
+
14
+ ### Plugin global config
15
+
16
+ - `timestamp-from`, `timestamp-to` and `duration` define time buckets for which to generate observations.
17
+ - `generators` define which fields to generate for each observation
18
+ - `components` define the components for which to generate observations. The observations generated according to `timestamp-from`, `timestamp-to`, `duration` and `generators` will be duplicated for each component.
19
+
20
+ ### Authentication
21
+
22
+ N/A
23
+
24
+ ### Inputs
25
+
26
+ The plugin's `global-config` section in the manifest file determines its behaviour.
27
+ 'inputs' section is ignored.
28
+
29
+ ### Typescript Usage
30
+
31
+ ```typescript
32
+ const mockObservations = MockObservations({
33
+ 'timestamp-from': '2023-07-06T00:00',
34
+ 'timestamp-to': '2023-07-06T00:10',
35
+ duration: 60,
36
+ components: {
37
+ 'instance-type': 'A1',
38
+ },
39
+ generators: {
40
+ common: {
41
+ region: 'uk-west',
42
+ },
43
+ },
44
+ });
45
+ const result = await mockObservations.execute([]);
46
+ ```
47
+
48
+ ### manifest Example
49
+
50
+ IF users will typically call the plugin as part of a pipeline defined in a `manifest` file. In this case, instantiating the plugin is handled by `ie` and does not have to be done explicitly by the user. The following is an example `manifest` that calls `mock-observation`:
51
+
52
+ ```yaml
53
+ name: mock-observation-demo
54
+ description: example invoking mock-observation plugin
55
+ tags:
56
+ initialize:
57
+ outputs:
58
+ - yaml
59
+ plugins:
60
+ mock-observations:
61
+ kind: plugin
62
+ method: MockObservations
63
+ path: 'builtin'
64
+ global-config:
65
+ timestamp-from: 2023-07-06T00:00
66
+ timestamp-to: 2023-07-06T00:10
67
+ duration: 60
68
+ components:
69
+ - instance-type: A1
70
+ - instance-type: B1
71
+ generators:
72
+ common:
73
+ region: uk-west
74
+ common-key: common-val
75
+ randint:
76
+ cpu/utilization:
77
+ min: 1
78
+ max: 99
79
+ memory/utilization:
80
+ min: 1
81
+ max: 99
82
+ tree:
83
+ children:
84
+ child:
85
+ pipeline:
86
+ - mock-observations
87
+ inputs:
88
+ ```
89
+
90
+ You can run this example `manifest` by saving it as `manifests/plugins/mock-observation.yml` and executing the following command from the project root:
91
+
92
+ ```sh
93
+ npm i -g @grnsft/if
94
+ ie --manifest ./examples/manifests/test/mock-observation.yml --output ./examples/outputs/mock-observation
95
+ ```
96
+
97
+ The results will be saved to a new `yaml` file in `./examples/outputs`.
@@ -0,0 +1,94 @@
1
+ # Multiply
2
+
3
+ `multiply` is a generic plugin for multiplying two or more values in an `input` array.
4
+
5
+ You provide the names of the values you want to multiply, and a name to use to append the product to the output array.
6
+
7
+ For example, you could multiply `cpu/energy` and `network/energy` and name the result `energy-product`. `energy-product` would then be added to every observation in your input array as the product of `cpu/energy` and `network/energy`.
8
+
9
+ ## Parameters
10
+
11
+ ### Plugin config
12
+
13
+ Two parameters are required in global config: `input-parameters` and `output-parameter`.
14
+
15
+ `input-parameters`: an array of strings. Each string should match an existing key in the `inputs` array
16
+ `output-parameter`: a string defining the name to use to add the product of the input parameters to the output array.
17
+
18
+ ### Inputs
19
+
20
+ All of `input-parameters` must be available in the input array.
21
+
22
+ ## Returns
23
+
24
+ - `output-parameter`: the product of all `input-parameters` with the parameter name defined by `output-parameter` in global config.
25
+
26
+ ## Calculation
27
+
28
+ ```pseudocode
29
+ output = input0 * input1 * input2 ... inputN
30
+ ```
31
+
32
+ ## Implementation
33
+
34
+ To run the plugin, you must first create an instance of `Multiply`. Then, you can call `execute()`.
35
+
36
+ ```typescript
37
+ import {Multiply} from 'builtins';
38
+
39
+ const config = {
40
+ inputParameters: ['cpu/energy', 'network/energy'],
41
+ outputParameter: 'energy-product',
42
+ };
43
+
44
+ const mult = Multiply(config);
45
+ const result = await mult.execute([
46
+ {
47
+ duration: 3600,
48
+ timestamp: '2021-01-01T00:00:00Z',
49
+ 'cpu/energy': 0.001,
50
+ 'memory/energy': 0.0005,
51
+ },
52
+ ]);
53
+ ```
54
+
55
+ ## Example manifest
56
+
57
+ IF users will typically call the plugin as part of a pipeline defined in a manifest file. In this case, instantiating the plugin is handled by `ie` and does not have to be done explicitly by the user. The following is an example manifest that calls `multiply`:
58
+
59
+ ```yaml
60
+ name: multiply-demo
61
+ description:
62
+ tags:
63
+ initialize:
64
+ outputs:
65
+ - yaml
66
+ plugins:
67
+ multiply:
68
+ method: Multiply
69
+ path: 'builtin'
70
+ global-config:
71
+ input-parameters: ['cpu/energy', 'network/energy']
72
+ output-parameter: 'energy-product'
73
+ tree:
74
+ children:
75
+ child:
76
+ pipeline:
77
+ - multiply
78
+ config:
79
+ multiply:
80
+ inputs:
81
+ - timestamp: 2023-08-06T00:00
82
+ duration: 3600
83
+ cpu/energy: 0.001
84
+ network/energy: 0.001
85
+ ```
86
+
87
+ You can run this example by saving it as `./examples/manifests/test/multiply.yml` and executing the following command from the project root:
88
+
89
+ ```sh
90
+ npm i -g @grnsft/if
91
+ ie --manifest ./examples/manifests/test/multiply.yml --output ./examples/outputs/multiply.yml
92
+ ```
93
+
94
+ The results will be saved to a new `yaml` file in `./examples/outputs`
@@ -0,0 +1,91 @@
1
+ # Regex
2
+
3
+ `regex` is a generic plugin to match part of one string in an `input` and extract it into an output.
4
+
5
+ You provide the name of the value you want to match, and a name to use to add the regex to the output array.
6
+
7
+ For example, `boavizta-cpu` need `cpu/name` to work, however `cloud-metadata` returns `physical-processor` which usually contains a long string of processors that the instance could be separated by `,`, like so:
8
+
9
+ ```
10
+ Intel® Xeon® Platinum 8272CL,Intel® Xeon® 8171M 2.1 GHz,Intel® Xeon® E5-2673 v4 2.3 GHz,Intel® Xeon® E5-2673 v3 2.4 GHz
11
+ ```
12
+
13
+ ## Parameters
14
+
15
+ ### Plugin config
16
+
17
+ - `parameter` - a parameter by a specific configured string
18
+ - `match` - a regex by which needs to match the `parameter`
19
+ - `output` - output parameter name in the input
20
+
21
+ ### Inputs
22
+
23
+ - `parameter` - as input parameter, must be available in the input array
24
+
25
+ ## Returns
26
+
27
+ - `output`: the first match of `parameter` with the parameter name with `match` defined in global config.
28
+
29
+ ## Implementation
30
+
31
+ To run the plugin, you must first create an instance of `Regex`. Then, you can call `execute()`.
32
+
33
+ ```typescript
34
+
35
+ const globalConfig = {
36
+ parameter: 'physical-processor',
37
+ match: '^[^,]+',
38
+ output: 'cpu/name',
39
+ };
40
+ const regex = Regex(globalConfig);
41
+
42
+ const input = [
43
+ {
44
+ timestamp: '2021-01-01T00:00:00Z',
45
+ duration: 3600,
46
+ 'physical-processor':
47
+ 'Intel® Xeon® Platinum 8272CL,Intel® Xeon® 8171M 2.1 GHz,Intel® Xeon® E5-2673 v4 2.3 GHz,Intel® Xeon® E5-2673 v3 2.4 GHz',
48
+ },
49
+ ];
50
+ ```
51
+
52
+ ## Example manifest
53
+
54
+ IF users will typically call the plugin as part of a pipeline defined in a manifest file. In this case, instantiating the plugin is handled by `if` and does not have to be done explicitly by the user. The following is an example manifest that calls `regex`:
55
+
56
+ ```yaml
57
+ name: regex-demo
58
+ description:
59
+ tags:
60
+ initialize:
61
+ outputs:
62
+ - yaml
63
+ plugins:
64
+ regex:
65
+ method: Regex
66
+ path: 'builtin'
67
+ global-config:
68
+ parameter: physical-processor
69
+ match: ^[^,]+
70
+ output: cpu/name
71
+ tree:
72
+ children:
73
+ child:
74
+ pipeline:
75
+ - regex
76
+ config:
77
+ regex:
78
+ inputs:
79
+ - timestamp: 2023-08-06T00:00
80
+ duration: 3600
81
+ physical-processor: Intel® Xeon® Platinum 8272CL,Intel® Xeon® 8171M 2.1 GHz,Intel® Xeon® E5-2673 v4 2.3 GHz,Intel® Xeon® E5-2673 v3 2.4 GHz
82
+ ```
83
+
84
+ You can run this example by saving it as `manifests/plugins/regex.yml` and executing the following command from the project root:
85
+
86
+ ```sh
87
+ npm i -g @grnsft/if
88
+ if --manifest manifests/examples/regex.yml --output manifests/outputs/regex.yml
89
+ ```
90
+
91
+ The results will be saved to a new `yaml` file in `manifests/outputs`.
@@ -0,0 +1,89 @@
1
+ # SCI (software carbon intensity)
2
+
3
+ [SCI](https://sci-guide.greensoftware.foundation/) represents the amount of carbon emitted per [functional unit](https://sci-guide.greensoftware.foundation/R/).
4
+
5
+ ## Parameters
6
+
7
+ ### Plugin global config
8
+
9
+ - `functional-unit`: the name of the functional unit in which to express the carbon impact (required)
10
+
11
+
12
+ ### Inputs
13
+
14
+
15
+ - `carbon`: total carbon in gCO2eq (required)
16
+ - `functional-unit`: whatever `functional-unit` you define in global config also has to be present in each input, for example if you provide `functional-unit: requests` in global config, `requests` must be present in your input data.
17
+
18
+ ## Returns
19
+
20
+ - `sci`: carbon expressed in terms of the given functional unit
21
+
22
+ ## Calculation
23
+
24
+ SCI is calculated as:
25
+
26
+ ```pseudocode
27
+ sci = carbon / functional unit
28
+ ```
29
+
30
+
31
+ ## IF Implementation
32
+
33
+ To run the plugin, you must first create an instance of `Sci`. Then, you can call `execute()` to return `sci`.
34
+
35
+ ```typescript
36
+ import {Sci} from 'builtins';
37
+
38
+ const sci = Sci({'functional-unit': 'requests'});
39
+ const results = await sci.execute(
40
+ [
41
+ {
42
+ 'carbon': 5'
43
+ duration: 1,
44
+ requests: 100,
45
+ },
46
+ ]
47
+ );
48
+ ```
49
+
50
+ ## Example manifest
51
+
52
+ IF users will typically call the plugin as part of a pipeline defined in a `manifest` file. In this case, instantiating the plugin is handled by `ie` and does not have to be done explicitly by the user.
53
+
54
+ The following is an example `manifest` that calls `sci`:
55
+
56
+ ```yaml
57
+ name: sci-demo
58
+ description: example invoking sci plugin
59
+ tags:
60
+ initialize:
61
+ outputs:
62
+ - yaml
63
+ plugins:
64
+ sci:
65
+ method: Sci
66
+ path: 'builtin'
67
+ global-config:
68
+ functional-unit: 'requests'
69
+ tree:
70
+ children:
71
+ child:
72
+ pipeline:
73
+ - sci
74
+ config:
75
+ inputs:
76
+ - timestamp: 2023-07-06T00:00
77
+ carbon: 5
78
+ duration: 1
79
+ requests: 100
80
+ ```
81
+
82
+ You can run this example `manifest` by saving it as `./manifests/plugins/sci.yml` and executing the following command from the project root:
83
+
84
+ ```sh
85
+ npm i -g @grnsft/if
86
+ ie --manifest manifests/plugins/sci.yml --output manifests/outputs/sci.yml
87
+ ```
88
+
89
+ The results will be saved to a new `yaml` file.