Skip to content

Commit

Permalink
Merge pull request #391 from Green-Software-Foundation/models-univers…
Browse files Browse the repository at this point in the history
…e-optimization

Models universe optimization
  • Loading branch information
jmcook1186 authored Jan 15, 2024
2 parents 3fbcb2b + 9d8de70 commit 83b38e1
Show file tree
Hide file tree
Showing 5 changed files with 138 additions and 114 deletions.
4 changes: 2 additions & 2 deletions src/__mocks__/model-universe/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ export class ModelsUniverse {
/**
* Initializes and registers model.
*/
public writeDown(model: ImplInitializeModel) {
const {name} = model;
public bulkWriteDown(models: ImplInitializeModel[]) {
const {name} = models[0];

const Model = this.handModelByCriteria();

Expand Down
201 changes: 114 additions & 87 deletions src/__tests__/unit/lib/models-universe.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ describe('lib/models-universe: ', () => {

expect(typeof modelsHandbook.getInitializedModel).toBe('function');
expect(typeof modelsHandbook.initalizedModels).toBe('object');
expect(typeof modelsHandbook.writeDown).toBe('function');
expect(typeof modelsHandbook.bulkWriteDown).toBe('function');
expect(modelsHandbook.initalizedModels).toEqual({});
});
});
Expand All @@ -40,13 +40,15 @@ describe('lib/models-universe: ', () => {

it('throws `missing classname` error in case if classname/model is missing.', async () => {
const modelsHandbook = new ModelsUniverse();
const modelInfo: ImplInitializeModel = {
config: {},
name: 'test',
};
const modelsInfo: ImplInitializeModel[] = [
{
config: {},
name: 'test',
},
];

try {
await modelsHandbook.writeDown(modelInfo);
await modelsHandbook.bulkWriteDown(modelsInfo);
} catch (error) {
if (error instanceof Error) {
expect(error.message).toEqual(MISSING_CLASSNAME);
Expand All @@ -56,19 +58,21 @@ describe('lib/models-universe: ', () => {

it('throws `missing path parameter` error while registration of `plugin` model.', async () => {
const modelsHandbook = new ModelsUniverse();
const modelInfo: ImplInitializeModel = {
config: {
allocation: 'mock-allocation',
verbose: true,
const modelsInfo: ImplInitializeModel[] = [
{
config: {
allocation: 'mock-allocation',
verbose: true,
},
name: 'mock-name',
model: 'MockaviztaModel',
},
name: 'mock-name',
model: 'MockaviztaModel',
};
];

expect.assertions(2);

try {
await modelsHandbook.writeDown(modelInfo);
await modelsHandbook.bulkWriteDown(modelsInfo);
} catch (error) {
if (error instanceof Error) {
expect(error).toBeInstanceOf(Error);
Expand All @@ -95,28 +99,29 @@ describe('lib/models-universe: ', () => {
console.log = mockLog;

const modelsHandbook = new ModelsUniverse();
const modelInfo: ImplInitializeModel = {
config: {
allocation: 'mock-allocation',
verbose: true,
const modelsInfo: ImplInitializeModel[] = [
{
config: {
allocation: 'mock-allocation',
verbose: true,
},
name: 'mock-name',
model: 'MockaviztaModel',
path: 'https://github.com/mock/mockavizta-model',
},
name: 'mock-name',
model: 'MockaviztaModel',
path: 'https://github.com/mock/mockavizta-model',
};
];

const modelsList = await modelsHandbook.writeDown(modelInfo);
const model = modelsList[modelInfo.name];
const currentModel = modelsInfo[0];
await modelsHandbook.bulkWriteDown(modelsInfo);
const model = await modelsHandbook.getInitializedModel(
currentModel.name,
currentModel.config
);

expect.assertions(2);

const response = await model({
'core-units': 1,
'physical-processor': 'intel',
});

expect(mockLog).toHaveBeenCalledWith(NOT_NATIVE_MODEL);
expect(response).toBeInstanceOf(MockModel);
expect(model).toBeInstanceOf(MockModel);

console.log = originalLog;
});
Expand All @@ -132,25 +137,26 @@ describe('lib/models-universe: ', () => {
);

const modelsHandbook = new ModelsUniverse();
const modelInfo: ImplInitializeModel = {
config: {
allocation: 'mock-allocation',
verbose: true,
const modelsInfo: ImplInitializeModel[] = [
{
config: {
allocation: 'mock-allocation',
verbose: true,
},
name: 'mock-name',
model: 'MockaviztaModel',
path: 'https://github.com/mock/mockavizta-model',
},
name: 'mock-name',
model: 'MockaviztaModel',
path: 'https://github.com/mock/mockavizta-model',
};
];
expect.assertions(2);

const currentModel = modelsInfo[0];
try {
const modelsList = await modelsHandbook.writeDown(modelInfo);
const model = modelsList[modelInfo.name];

await model({
'core-units': 1,
'physical-processor': 'intel',
});
await modelsHandbook.bulkWriteDown(modelsInfo);
modelsHandbook.getInitializedModel(
currentModel.name,
currentModel.config
);
} catch (error) {
expect(error).toBeInstanceOf(ModelInitializationError);

Expand All @@ -171,32 +177,36 @@ describe('lib/models-universe: ', () => {
);

const modelsHandbook = new ModelsUniverse();
const modelInfo = {
config: {
allocation: 'mock-allocation',
verbose: true,
const modelsInfo = [
{
config: {
allocation: 'mock-allocation',
verbose: true,
},
name: 'mock-name',
model: 'MockaviztaModel',
path: 'https://github.com/mock/mockavizta-model',
},
name: 'mock-name',
model: 'MockaviztaModel',
path: 'https://github.com/mock/mockavizta-model',
};
];
expect.assertions(2);

const currentModel = modelsInfo[0];

/**
* Parses module from github repo.
*/
const parts = modelInfo.path.split('/');
const parts = currentModel.path.split('/');
const path = parts[parts.length - 1];

try {
await modelsHandbook.writeDown(modelInfo);
await modelsHandbook.bulkWriteDown(modelsInfo);
} catch (error) {
expect(error).toBeInstanceOf(ModelInitializationError);

if (error instanceof ModelInitializationError) {
expect(error.message).toEqual(
NOT_CONSTRUCTABLE_MODEL({
model: modelInfo.model,
model: currentModel.model,
path,
})
);
Expand All @@ -206,25 +216,29 @@ describe('lib/models-universe: ', () => {

it('should throw `invalid module path` error if provided path is invalid.', async () => {
const modelsHandbook = new ModelsUniverse();
const modelInfo = {
config: {
allocation: 'mock-allocation',
verbose: true,
const modelsInfo = [
{
config: {
allocation: 'mock-allocation',
verbose: true,
},
name: 'mock-name',
model: 'MockaviztaModel',
path: 'mock-module',
},
name: 'mock-name',
model: 'MockaviztaModel',
path: 'mock-module',
};
];
expect.assertions(2);

const currentModel = modelsInfo[0];

/**
* Parses module from github repo.
*/
const parts = modelInfo.path.split('/');
const parts = currentModel.path.split('/');
const path = parts[parts.length - 1];

try {
await modelsHandbook.writeDown(modelInfo);
await modelsHandbook.bulkWriteDown(modelsInfo);
} catch (error) {
expect(error).toBeInstanceOf(ModelInitializationError);

Expand Down Expand Up @@ -266,18 +280,25 @@ describe('lib/models-universe: ', () => {
);

const modelsHandbook = new ModelsUniverse();
const modelInfo: ImplInitializeModel = {
config: {
allocation: 'mock-allocation',
verbose: true,
const modelsInfo: ImplInitializeModel[] = [
{
config: {
allocation: 'mock-allocation',
verbose: true,
},
name: 'mock-name',
model: 'MockaviztaModel',
path: 'https://github.com/mock/mockavizta-model',
},
name: 'mock-name',
model: 'MockaviztaModel',
path: 'https://github.com/mock/mockavizta-model',
};
];

await modelsHandbook.writeDown(modelInfo);
const model = await modelsHandbook.getInitializedModel(modelInfo.name, {});
const currentModel = modelsInfo[0];

await modelsHandbook.bulkWriteDown(modelsInfo);
const model = await modelsHandbook.getInitializedModel(
currentModel.name,
{}
);

expect.assertions(1);

Expand All @@ -286,19 +307,25 @@ describe('lib/models-universe: ', () => {

it('successfully return initialized builtin model.', async () => {
const modelsHandbook = new ModelsUniverse();
const modelInfo: ImplInitializeModel = {
config: {
startTime: 'mock-startTime',
endTime: 'mock-startTime',
interval: 5,
const modelsInfo: ImplInitializeModel[] = [
{
config: {
startTime: 'mock-startTime',
endTime: 'mock-startTime',
interval: 5,
},
name: 'time-sync',
model: 'TimeSyncModel',
path: 'builtin',
},
name: 'time-sync',
model: 'TimeSyncModel',
path: 'builtin',
};
];
const currentModel = modelsInfo[0];

await modelsHandbook.writeDown(modelInfo);
const model = await modelsHandbook.getInitializedModel(modelInfo.name, {});
await modelsHandbook.bulkWriteDown(modelsInfo);
const model = await modelsHandbook.getInitializedModel(
currentModel.name,
{}
);

expect.assertions(2);

Expand Down
24 changes: 6 additions & 18 deletions src/__tests__/unit/lib/supercomputer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,7 @@ describe('lib/supercomputer: ', () => {
delete implCopy.graph.children[childName].inputs;

const modelsHandbook = new ModelsUniverse();
for (const model of impl.initialize.models) {
await modelsHandbook.writeDown(model);
}
await modelsHandbook.bulkWriteDown(implCopy.initialize.models);

const node = new Supercomputer(implCopy, modelsHandbook);

Expand All @@ -109,9 +107,7 @@ describe('lib/supercomputer: ', () => {
implCopy.graph.children['front-end'].inputs[0].carbon = 10; // for mock

const modelsHandbook = new ModelsUniverse();
for (const model of impl.initialize.models) {
await modelsHandbook.writeDown(model);
}
await modelsHandbook.bulkWriteDown(implCopy.initialize.models);

const node = new Supercomputer(implCopy, modelsHandbook);

Expand Down Expand Up @@ -166,9 +162,7 @@ describe('lib/supercomputer: ', () => {
};

const modelsHandbook = new ModelsUniverse();
for (const model of implCopy.initialize.models) {
await modelsHandbook.writeDown(model);
}
await modelsHandbook.bulkWriteDown(implCopy.initialize.models);

const node = new Supercomputer(implCopy, modelsHandbook);
const result = await node.compute();
Expand Down Expand Up @@ -236,9 +230,7 @@ describe('lib/supercomputer: ', () => {
};

const modelsHandbook = new ModelsUniverse();
for (const model of implCopy.initialize.models) {
await modelsHandbook.writeDown(model);
}
await modelsHandbook.bulkWriteDown(implCopy.initialize.models);

const node = new Supercomputer(implCopy, modelsHandbook);

Expand Down Expand Up @@ -287,9 +279,7 @@ describe('lib/supercomputer: ', () => {
};

const modelsHandbook = new ModelsUniverse();
for (const model of implCopy.initialize.models) {
await modelsHandbook.writeDown(model);
}
await modelsHandbook.bulkWriteDown(implCopy.initialize.models);

const node = new Supercomputer(implCopy, modelsHandbook);

Expand Down Expand Up @@ -317,9 +307,7 @@ describe('lib/supercomputer: ', () => {
};

const modelsHandbook = new ModelsUniverse();
for (const model of implCopy.initialize.models) {
await modelsHandbook.writeDown(model);
}
await modelsHandbook.bulkWriteDown(implCopy.initialize.models);

const node = new Supercomputer(implCopy, modelsHandbook);

Expand Down
Loading

0 comments on commit 83b38e1

Please sign in to comment.