Skip to content
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ TK_LIB=$(dir $(shell find $(TCL_PREFIX) -name tk.tcl -path "*/tk$(TCL_VERSION)*"

# root directory for ecolab include files and libraries
ECOLAB_HOME=$(shell pwd)/ecolab
export LD_LIBRARY_PATH:=$(ECOLAB_HOME)/lib:$(LD_LIBRARY_PATH)
export LD_LIBRARY_PATH:=$(ECOLAB_HOME)/lib:$(LD_LIBRARY_PATH):/usr/local/lib64

ARCH=$(shell arch)
HAVE_CLANG=$(shell if which clang++>/dev/null; then echo 1; fi)
Expand Down
2 changes: 1 addition & 1 deletion RavelCAPI
2 changes: 1 addition & 1 deletion ecolab
Submodule ecolab updated 118 files
6 changes: 6 additions & 0 deletions gui-js/apps/minsky-electron/src/app/events/electron.events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,12 @@ ipcMain.handle(
}
);

ipcMain.on(
events.REFRESH_ALL_GODLEY_POPUPS, async () => {
WindowManager.refreshAllGodleyPopups();
}
);

ipcMain.on(events.ADD_RECENT_FILE, (event, filePath: string) => {
RecentFilesManager.addFileToRecentFiles(filePath);
});
Expand Down
11 changes: 11 additions & 0 deletions gui-js/apps/minsky-electron/src/app/managers/WindowManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
ActiveWindow,
AppLayoutPayload,
CreateWindowPayload,
events,
Functions,
minsky,
OPEN_DEV_TOOLS_IN_DEV_BUILD,
Expand Down Expand Up @@ -370,4 +371,14 @@ export class WindowManager {
type: 'info',
});
}

static refreshAllGodleyPopups() {
for (const win of WindowManager.activeWindows.values())
if (win.context!=WindowManager.getMainWindow()) {
try {
win.context?.webContents?.send(events.GODLEY_POPUP_REFRESH);
}
catch (err) {} // absorb any exceptions due to windows disappearing
}
}
}
1 change: 0 additions & 1 deletion gui-js/libs/shared/src/lib/backend/minsky.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1576,7 +1576,6 @@ export class PlotWidget extends Item {
this.yvars=new Sequence<Sequence<VariableValue>>(this.$prefix()+'.yvars',Sequence<VariableValue>);
}
async AssignSide(a1: number,a2: string): Promise<void> {return this.$callMethod('AssignSide',a1,a2);}
async Image(...args: any[]): Promise<string> {return this.$callMethod('Image',...args);}
async LabelPen(a1: number,a2: ecolab__cairo__Surface): Promise<void> {return this.$callMethod('LabelPen',a1,a2);}
async addConstantCurves(): Promise<void> {return this.$callMethod('addConstantCurves');}
async addPlotPt(a1: number): Promise<void> {return this.$callMethod('addPlotPt',a1);}
Expand Down
1 change: 1 addition & 0 deletions gui-js/libs/shared/src/lib/constants/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ export const events = {
RECORD: 'record',
RECORDING_REPLAY: 'recording-replay',
RECORDING_STATUS_CHANGED: 'recording-status-changed',
REFRESH_ALL_GODLEY_POPUPS: 'refresh-all-godley-popups',
REFRESH_CSV_IMPORT: 'refresh-csv-import',
REPLAY_RECORDING: 'replay-recording',
RESET_ZOOM: 'reset-zoom',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,10 +290,10 @@ export class GodleyWidgetViewComponent implements OnDestroy, OnInit, AfterViewIn
await this.hardRefresh();
}

async hardRefresh(update = true) {
async hardRefresh() {
this.multiEquityAllowed = await this.electronService.minsky.multipleEquities();

if(update) this.godleyIcon.update();
this.godleyIcon.update();

const allData: string[][] = <any>await this.godleyIcon.table.getData();

Expand Down Expand Up @@ -378,7 +378,7 @@ export class GodleyWidgetViewComponent implements OnDestroy, OnInit, AfterViewIn
this.cellEditing[1] = undefined;
}

await this.hardRefresh();
this.electronService.send(events.REFRESH_ALL_GODLEY_POPUPS);
}
}

Expand Down
1 change: 1 addition & 0 deletions model/godleyIcon.cc
Original file line number Diff line number Diff line change
Expand Up @@ -632,6 +632,7 @@ namespace minsky
if (m_editorMode)
{
editor.mouseMove(-1,-1);
minsky().balanceDuplicateColumns(*this, editor.selectedCol);
// May be a bit overzealous, but it solves bug 1273, which is caused by a flow which has not yet fully come into existence....
editor.selectedCol=-1;
editor.selectedRow=-1;
Expand Down
57 changes: 42 additions & 15 deletions test/testTensorOps.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1195,32 +1195,45 @@ TEST_F(TensorValFixture, reduction2dswapped)
EXPECT_TRUE(chc.xvectors[1]==ahc.xvectors[0]);
EXPECT_EQ(9,chain.back()->size());
vector<double> expected={3,15,27,5,17,29,7,19,31};
for (size_t _i=0; _i<9; ++_i) EXPECT_EQ(expected[_i], (*chain.back())[_i]);
// above expected was in sorted index order
auto index=chain.back()->index();
vector<size_t> sortedIdx(index.begin(),index.end()); sort(sortedIdx.begin(),sortedIdx.end());
for (size_t _i=0; _i<9; ++_i) EXPECT_EQ(expected[_i], chain.back()->atHCIndex(sortedIdx[_i]));

sex->reductionOp=ravel::Op::prod;
chain=createRavelChain(state, arg);
expected={0,54,180,4,70,208,10,88,238};
for (size_t _i=0; _i<9; ++_i) EXPECT_EQ(expected[_i], (*chain.back())[_i]);
index=chain.back()->index();
sortedIdx=vector<size_t>(index.begin(),index.end()); sort(sortedIdx.begin(),sortedIdx.end());
for (size_t _i=0; _i<9; ++_i) EXPECT_EQ(expected[_i], chain.back()->atHCIndex(sortedIdx[_i]));

sex->reductionOp=ravel::Op::av;
chain=createRavelChain(state, arg);
expected={1.5,7.5,13.5,2.5,8.5,14.5,3.5,9.5,15.5};
for (size_t _i=0; _i<9; ++_i) EXPECT_EQ(expected[_i], (*chain.back())[_i]);
index=chain.back()->index();
sortedIdx=vector<size_t>(index.begin(),index.end()); sort(sortedIdx.begin(),sortedIdx.end());
for (size_t _i=0; _i<9; ++_i) EXPECT_EQ(expected[_i], chain.back()->atHCIndex(sortedIdx[_i]));

sex->reductionOp=ravel::Op::stddev;
chain=createRavelChain(state, arg);
expected={2.12132, 2.12132, 2.12132, 2.12132, 2.12132, 2.12132, 2.12132, 2.12132, 2.12132};
for (size_t _i=0; _i<9; ++_i) EXPECT_NEAR(expected[_i], (*chain.back())[_i], 1e-4);
index=chain.back()->index();
sortedIdx=vector<size_t>(index.begin(),index.end()); sort(sortedIdx.begin(),sortedIdx.end());
for (size_t _i=0; _i<9; ++_i) EXPECT_NEAR(expected[_i], chain.back()->atHCIndex(sortedIdx[_i]), 1e-4);

sex->reductionOp=ravel::Op::min;
chain=createRavelChain(state, arg);
expected={0,6,12,1,7,13,2,8,14};
for (size_t _i=0; _i<9; ++_i) EXPECT_EQ(expected[_i], (*chain.back())[_i]);
index=chain.back()->index();
sortedIdx=vector<size_t>(index.begin(),index.end()); sort(sortedIdx.begin(),sortedIdx.end());
for (size_t _i=0; _i<9; ++_i) EXPECT_EQ(expected[_i], chain.back()->atHCIndex(sortedIdx[_i]));

sex->reductionOp=ravel::Op::max;
chain=createRavelChain(state, arg);
expected={3,9,15,4,10,16,5,11,17};
for (size_t _i=0; _i<9; ++_i) EXPECT_EQ(expected[_i], (*chain.back())[_i]);
index=chain.back()->index();
sortedIdx=vector<size_t>(index.begin(),index.end()); sort(sortedIdx.begin(),sortedIdx.end());
for (size_t _i=0; _i<9; ++_i) EXPECT_EQ(expected[_i], chain.back()->atHCIndex(sortedIdx[_i]));

}

Expand All @@ -1234,28 +1247,42 @@ TEST_F(TensorValFixture, sparseSlicedRavel)
auto chain=createRavelChain(state, arg);
EXPECT_EQ(2, chain.back()->rank());
EXPECT_EQ(3, chain.back()->size());
vector<size_t> expectedi{0,5,6};
for (size_t _i=0; _i<3; ++_i) EXPECT_EQ(expectedi[_i], chain[1]->index()[_i]);
set<size_t> expectedi{0,5,6};
set<size_t> idx(chain[1]->index().begin(), chain[1]->index().end());
EXPECT_TRUE(idx==expectedi);
expectedi={0,2,7};
for (size_t _i=0; _i<3; ++_i) EXPECT_EQ(expectedi[_i], chain.back()->index()[_i]);
idx=set<size_t>(chain.back()->index().begin(),chain.back()->index().end());
EXPECT_TRUE(idx==expectedi);

vector<double> expectedf{0,1,2,3,4};
for (size_t _i=0; _i<3; ++_i) EXPECT_EQ(expectedf[_i], (*arg)[_i]);
expectedf={0,2,3};
for (size_t _i=0; _i<3; ++_i) EXPECT_EQ(expectedf[_i], (*chain[1])[_i]);
auto index=chain[1]->index();
vector<size_t> sortedIdx(index.begin(),index.end()); sort(sortedIdx.begin(),sortedIdx.end());
for (size_t _i=0; _i<3; ++_i) EXPECT_EQ(expectedf[_i], chain[1]->atHCIndex(sortedIdx[_i]));
expectedf={0,3,2};
for (size_t _i=0; _i<3; ++_i) EXPECT_EQ(expectedf[_i], (*chain.back())[_i]);
index=chain.back()->index();
sortedIdx=vector<size_t>(index.begin(),index.end()); sort(sortedIdx.begin(),sortedIdx.end());
for (size_t _i=0; _i<3; ++_i) EXPECT_EQ(expectedf[_i], chain.back()->atHCIndex(sortedIdx[_i]));

sex->collapsed=true;
chain=createRavelChain(state, arg);
EXPECT_EQ(5, chain.back()->size());
expectedi={0,1,5,6,7};
for (size_t _i=0; _i<3; ++_i) EXPECT_EQ(expectedi[_i], chain[1]->index()[_i]);
idx=set<size_t>(chain[1]->index().begin(),chain[1]->index().end());
EXPECT_TRUE(idx==expectedi);

expectedi={0,2,3,5,7};
for (size_t _i=0; _i<3; ++_i) EXPECT_EQ(expectedi[_i], chain.back()->index()[_i]);
idx=set<size_t>(chain.back()->index().begin(),chain.back()->index().end());
EXPECT_TRUE(idx==expectedi);
expectedf={0,1,2,3,4};
for (size_t _i=0; _i<5; ++_i) EXPECT_EQ(expectedf[_i], (*chain[1])[_i]);
index=chain[1]->index();
sortedIdx=vector<size_t>(index.begin(),index.end()); sort(sortedIdx.begin(),sortedIdx.end());
for (size_t _i=0; _i<5; ++_i) EXPECT_EQ(expectedf[_i], chain[1]->atHCIndex(sortedIdx[_i]));
expectedf={0,3,1,4,2};
for (size_t _i=0; _i<5; ++_i) EXPECT_EQ(expectedf[_i], (*chain.back())[_i]);
index=chain.back()->index();
sortedIdx=vector<size_t>(index.begin(),index.end()); sort(sortedIdx.begin(),sortedIdx.end());
for (size_t _i=0; _i<5; ++_i) EXPECT_EQ(expectedf[_i], chain.back()->atHCIndex(sortedIdx[_i]));
}

TEST_F(TensorValFixture, calipered)
Expand Down
Loading