Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
32c59d6
Release 3.20.0-beta.1
highperformancecoder Nov 5, 2025
d0fac01
Merge branch 'master' into develop
highperformancecoder Nov 9, 2025
45625dc
Release 3.21.0-beta.1
highperformancecoder Nov 9, 2025
b7fe093
Merge branch 'master' into develop
highperformancecoder Dec 5, 2025
df2afc0
CPUProfile support
highperformancecoder Dec 13, 2025
3188f22
Fix regression failures.
highperformancecoder Dec 15, 2025
fb25c32
Update RavelCAPI ref
highperformancecoder Dec 16, 2025
a6e4015
Update RavelCAPI ref.
highperformancecoder Dec 16, 2025
d6d1369
Add shared_mutex to RavelWrap class to make the entire class thread s…
highperformancecoder Dec 18, 2025
b2d9513
Enable OpenMP by default
highperformancecoder Dec 24, 2025
e80ad5d
Remove obsolete check of EcoLab being built in AQUA mode (again!).
highperformancecoder Dec 24, 2025
30dcf2f
Another go at enabling OpenMP by default.
highperformancecoder Dec 26, 2025
b5b2c82
Disable OpenMP on MacOSX
highperformancecoder Dec 26, 2025
510997e
Add libgomp to list of DLLs to copy into final package for Windows bu…
highperformancecoder Dec 26, 2025
ea80e4f
Merge branch 'develop' of github.com:highperformancecoder/minsky into…
highperformancecoder Dec 26, 2025
36fec96
Release 3.21.0-beta.2
highperformancecoder Dec 26, 2025
8241e9b
Merge branch 'master' into develop
highperformancecoder Dec 27, 2025
b7a431e
Release 3.21.0-beta.3
highperformancecoder Dec 27, 2025
d972979
Merge branch 'master' into develop
highperformancecoder Dec 28, 2025
62ab446
Pass MAKEOVERRIDES to tests target, and enable OpenMP unconditionally…
highperformancecoder Dec 28, 2025
8519b21
Release 3.21.0-beta.4
highperformancecoder Dec 30, 2025
cd321f9
Remove mutex in RavelWrap in favor of thread safety in RavelCAPI. For…
highperformancecoder Jan 21, 2026
1cc303a
Update EcoLab ref.
highperformancecoder Jan 21, 2026
0149a7f
Indentation and whitespace fixes.
highperformancecoder Jan 21, 2026
6f36ef4
Remove shared_mutex header include
highperformancecoder Jan 21, 2026
dd41404
Add /usr/local/lib to LD_LIBRARY_PATH
highperformancecoder Jan 21, 2026
7b444f2
Needs to be /usr/local/lib64
highperformancecoder Jan 21, 2026
1986874
Merge pull request #597 from highperformancecoder/bugfix-1900
highperformancecoder Jan 21, 2026
c10c232
Merge branch 'master' into develop
highperformancecoder Jan 25, 2026
44698a9
Release 3.22.0-beta.1
highperformancecoder Jan 25, 2026
4691364
Merge branch 'master' into develop
highperformancecoder Jan 26, 2026
6b37409
Release 3.22.0-beta.2
highperformancecoder Jan 26, 2026
0692629
Merge branch 'master' into develop
highperformancecoder Feb 2, 2026
c07eced
Update RavelCAPI
highperformancecoder Feb 13, 2026
f1522dc
Merge branch 'master' into develop
highperformancecoder Mar 5, 2026
b58dcef
Added dummy typsecript type for civita::ITensorVal.
highperformancecoder Mar 5, 2026
c427abe
Bump @tootallnate/once, jest-environment-jsdom and jest-preset-angular
dependabot[bot] Mar 5, 2026
efc1e20
Fixed up npm dependencies.
highperformancecoder Mar 6, 2026
166c423
Fixed up module import errors.
highperformancecoder Mar 6, 2026
0296c3a
Added changeDetector to about box to fix version numbers not showing
highperformancecoder Mar 6, 2026
e374f65
Get jest-tests to import common-test to pick up the right LD_LIBRARY_…
highperformancecoder Mar 10, 2026
472598c
Update node requirement to match angular floor.
highperformancecoder Mar 10, 2026
7a2a8c6
Wrap shared jest test with xfvb-run to allow clipboard operations to …
highperformancecoder Mar 10, 2026
186e7e0
Fix Angular 21 router testing import - replace deprecated RouterTesti…
highperformancecoder Mar 10, 2026
52fc37e
Add -a option to xvfb-run in jest-tests to prevent xvfb failing to fi…
highperformancecoder Mar 10, 2026
c10c212
Merge branch 'develop' into dependabot/npm_and_yarn/gui-js/multi-abb2…
highperformancecoder Mar 10, 2026
8beed81
Merge branch 'master' into develop
highperformancecoder Mar 10, 2026
8f96b4f
Merge branch 'develop' into dependabot/npm_and_yarn/gui-js/multi-abb2…
highperformancecoder Mar 10, 2026
77bccbd
Update package-lock.json
highperformancecoder Mar 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Doxyversion
Original file line number Diff line number Diff line change
@@ -1 +1 @@
PROJECT_NAME=Minsky: 3.23.0
PROJECT_NAME=Minsky: 3.22.0-beta.2
10 changes: 6 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ export AEGIS
export MXE
export OPENMP
export OPT
#export FLAGS
export CPLUSPLUS

# root directory for ecolab include files and libraries
Expand Down Expand Up @@ -224,7 +223,10 @@ ifeq ($(CPLUSPLUS),clang++)
FLAGS+=-Wno-unused-command-line-argument -Wno-unknown-warning-option -Wno-defaulted-function-deleted -Wno-uninitialized
endif

ifdef OPENMP
# enable OPENMP by default
#ifdef OPENMP
# Default compiler on MacOSX does not support OpenMP. Sigh!
ifneq ($(OS),Darwin)
FLAGS+=-fopenmp
LIBS+=-fopenmp
endif
Expand Down Expand Up @@ -300,7 +302,7 @@ MXE_DLLS=libboost_thread-mt-x64 libbrotlidec libbrotlicommon libbz2 libcairo-2 \
libcroco-0 libcrypto-3-x64 \
libexpat-1 libffi libfontconfig-1 libfreetype-6 libfribidi-0 libgcc_s_seh-1 \
libgdk_pixbuf-2 libgio-2 libglib-2 libgmodule-2 \
libgobject-2 libgsl-27 libgslcblas-0 libharfbuzz-0 libiconv-2 libintl-8 \
libgobject-2 libgomp-1 libgsl-27 libgslcblas-0 libharfbuzz-0 libiconv-2 libintl-8 \
libjpeg-9 liblzma-5 libpango-1 libpangocairo-1 libpangoft2-1 libpangowin32-1 \
libpcre2-8-0 libpixman-1-0 libpng16-16 libreadline8 librsvg-2-2 libssl-3-x64 \
libstdc++-6 libtermcap libwinpthread-1 libxml2-16 tcl86 zlib1 \
Expand Down Expand Up @@ -490,7 +492,7 @@ node-api.o: node-api.cc
$(EXES):

tests: $(EXES)
cd test; $(MAKE)
cd test; $(MAKE) $(MAKEOVERRIDES) CPLUSPLUS="$(CPLUSPLUS)"

BASIC_CLEAN=rm -rf *.o *~ "\#*\#" core *.d *.cd *.rcd *.tcd *.xcd *.gcda *.gcno *.so *.dll *.dylib

Expand Down
2 changes: 1 addition & 1 deletion doc/version.tex
Original file line number Diff line number Diff line change
@@ -1 +1 @@
\author{Version 3.23.0}
\author{Version 3.22.0-beta.2}
28 changes: 14 additions & 14 deletions engine/minskyTensorOps.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1560,24 +1560,24 @@ namespace minsky
double operator[](size_t i) const override {
if (chainChecked)
return chain.empty()? nan(""): (*chain.back())[i];
else
{ // first time through since reset, check the chain doesn't change
lock_guard lock(chainMutex); // mutex rather than critical, for possible rescursion
double v=nan("");
if (!chain.empty())
// first time through since reset, check the chain doesn't change
lock_guard lock(chainMutex); // mutex rather than critical, for possible rescursion
if (chainChecked) // in case we were waiting on another thread at the mutex
return chain.empty()? nan(""): (*chain.back())[i];
double v=nan("");
if (!chain.empty())
{
v=(*chain.back())[i];
if (m_timestamp<chain.back()->timestamp())
{
const_cast<Ravel&>(ravel).populateHypercube(arg->hypercube());
chain=ravel::createRavelChain(ravel.getState(), arg);
m_timestamp=Timestamp::clock::now();
chainChecked=true;
v=(*chain.back())[i];
if (m_timestamp<chain.back()->timestamp())
{
const_cast<Ravel&>(ravel).populateHypercube(arg->hypercube());
chain=ravel::createRavelChain(ravel.getState(), arg);
m_timestamp=Timestamp::clock::now();
chainChecked=true;
v=(*chain.back())[i];
}
}
return v;
}
return v;
}
size_t size() const override {return chain.empty()? 1: chain.back()->size();}
const Index& index() const override
Expand Down
10 changes: 7 additions & 3 deletions gui-js/apps/minsky-web/src/app/app.component.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { TestBed, waitForAsync } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { provideRouter } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
import { AppComponent } from './app.component';
import { MatDialog, MatDialogRef } from '@angular/material/dialog'
Expand All @@ -8,8 +8,12 @@ describe('AppComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
providers: [{ provide: MatDialog, useValue: {} }, { provide: MatDialogRef, useValue: {} }],
imports: [RouterTestingModule, TranslateModule.forRoot(), AppComponent],
providers: [
{ provide: MatDialog, useValue: {} },
{ provide: MatDialogRef, useValue: {} },
provideRouter([])
],
imports: [TranslateModule.forRoot(), AppComponent],
}).compileComponents();
})
);
Expand Down
15 changes: 11 additions & 4 deletions gui-js/apps/minsky-web/src/app/app.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import { TranslateService } from '@ngx-translate/core';
import { MatButtonModule } from '@angular/material/button';
import { HeaderComponent } from '../../../../libs/ui-components/src/lib/header/header.component';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';

import { NavigationEnd } from '@angular/router';
import { filter, first } from 'rxjs/operators';

@Component({
selector: 'minsky-root',
Expand Down Expand Up @@ -55,8 +56,7 @@ export class AppComponent implements OnInit, DoCheck {
}

async ngDoCheck() {
if(this.loading && this.router.url !== '/') {
this.loading = false;
if(this.loading) {
this.updatePubTabs();
this.cdRef.detectChanges();
Comment on lines 58 to 61
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Keep loading owned by the router.

At Line 60, loading is still cleared inside ngDoCheck, so the new NavigationEnd subscription at Lines 99-103 never actually controls the spinner. That means the loader still disappears on the first change-detection pass instead of after the first successful navigation.

Suggested fix
   loading = true;
   publicationTabs = [];
+  private initialized = false;
   private windowUtilityService: WindowUtilityService;
   private resizeTimeout;
@@
   async ngDoCheck() {
-    if(this.loading) {
-      this.loading = false;
+    if(!this.initialized) {
+      this.initialized = true;
       this.updatePubTabs();
       this.cdRef.detectChanges();

Keep this.loading = false; only in the NavigationEnd subscription.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@gui-js/apps/minsky-web/src/app/app.component.ts` around lines 58 - 62, The
ngDoCheck method currently clears this.loading too early, so remove the line
"this.loading = false;" from ngDoCheck and let the NavigationEnd subscription
(where you already set this.loading to false) be the single owner of the spinner
state; keep updatePubTabs() and this.cdRef.detectChanges() in ngDoCheck but
ensure only the NavigationEnd handler sets this.loading to false so the loader
closes after successful navigation (refer to ngDoCheck, updatePubTabs,
cdRef.detectChanges and the NavigationEnd subscription).


Expand Down Expand Up @@ -94,7 +94,14 @@ export class AppComponent implements OnInit, DoCheck {
async ngOnInit() {
this.electronService.on(events.CHANGE_MAIN_TAB, ()=>this.changeTab('minsky.canvas'));
this.electronService.on(events.PUB_TAB_REMOVED, ()=>this.updatePubTabs());
}
// stop spinner after first successful navigation
this.router.events
.pipe(filter(e => e instanceof NavigationEnd), first())
.subscribe(() => {
this.loading = false;
this.updatePubTabs();
this.cdRef.detectChanges();
}); }

async updatePubTabs() {
let pubTabs=await this.electronService.minsky.publicationTabs.$properties();
Expand Down
3 changes: 1 addition & 2 deletions gui-js/apps/minsky-web/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { TranslateModule, TranslateLoader } from '@ngx-translate/core';

import { AppRoutingModule } from './app/app-routing.module';

import { withInterceptorsFromDi, provideHttpClient, HttpClient, HttpClientModule } from '@angular/common/http';
import { withInterceptorsFromDi, provideHttpClient, HttpClient, } from '@angular/common/http';
import { provideAnimations } from '@angular/platform-browser/animations';
import { bootstrapApplication } from '@angular/platform-browser';

Expand All @@ -27,7 +27,6 @@ bootstrapApplication(AppComponent, {
deps: [HttpClient],
},
}),
HttpClientModule,
AppRoutingModule)
]
})
Expand Down
14 changes: 13 additions & 1 deletion gui-js/apps/minsky-web/src/test-setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,16 @@ globalThis.ngJest = {
errorOnUnknownProperties: true,
},
};
import 'jest-preset-angular/setup-jest';
import 'jest-preset-angular/setup-env/zone';
import '../../../libs/shared/src/test-setup';

import { TestBed } from '@angular/core/testing';
import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing';

// Initialize the Angular testing environment for Jest.
// Without this, TestBed.configureTestingModule() throws:
// "Need to call TestBed.initTestEnvironment() first"
TestBed.initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting(),
);
5 changes: 3 additions & 2 deletions gui-js/apps/minsky-web/tsconfig.app.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc",
"types": []
"types": [],
"moduleResolution": "bundler"
},
"files": ["src/main.ts"],
"include": ["src/**/*.d.ts"],
"exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"]
}
}
5 changes: 3 additions & 2 deletions gui-js/apps/minsky-web/tsconfig.spec.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc",
"types": ["jest", "node"]
"types": ["jest", "node"],
"moduleResolution": "bundler"
},
"files": ["src/test-setup.ts"],
"include": [
Expand All @@ -11,4 +12,4 @@
"src/**/*.spec.ts",
"src/**/*.d.ts"
]
}
}
7 changes: 4 additions & 3 deletions gui-js/libs/menu/src/lib/file/about/about.component.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Component, OnInit, VERSION } from '@angular/core';
import { Component, OnInit, VERSION, ChangeDetectorRef } from '@angular/core';
import { ElectronService } from '@minsky/core';
import { version } from '@minsky/shared';

Expand All @@ -14,15 +14,16 @@ export class AboutComponent implements OnInit {
frontEndVersion: string;
ravelVersion: string;

constructor(private electronService: ElectronService){}
constructor(private electronService: ElectronService, private cdRef: ChangeDetectorRef,){}

ngOnInit(): void {
(async () => {
let minsky=this.electronService.minsky;
this.ravelVersion = await minsky.ravelVersion();
this.minskyVersion = await minsky.minskyVersion();
this.frontEndVersion=version;
})();
// Ensure UI updates even if backend calls resolve outside Angular's zone.
this.cdRef.detectChanges(); })();
}

async closeWindow() {this.electronService.closeWindow();}
Expand Down
2 changes: 1 addition & 1 deletion gui-js/libs/shared/src/lib/constants/version.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const version="3.23.0";
export const version="3.22.0-beta.2";
2 changes: 1 addition & 1 deletion gui-js/libs/shared/src/test-setup.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'jest-preset-angular/setup-jest';
import 'jest-preset-angular/setup-env/zone';
import JSON5 from 'json5';
import {CppClass} from '@minsky/shared';

Expand Down
Loading
Loading