From 5a1727bfe245642a3a833eba1b916e6af20dc07b Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Thu, 9 Apr 2026 17:10:46 +1000 Subject: [PATCH 1/5] Fix for linear regression calculation using the x-vector when data is sparse. --- engine/minskyTensorOps.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/engine/minskyTensorOps.cc b/engine/minskyTensorOps.cc index 413f34903..4730d9830 100644 --- a/engine/minskyTensorOps.cc +++ b/engine/minskyTensorOps.cc @@ -1169,7 +1169,7 @@ namespace minsky } else { - if (rank()>1 && dimension>=y->rank()) return; + if (y->rank()>1 && dimension>=y->rank()) return; // construct x from y's x-vector auto tv=make_shared(); spreadX=tv; @@ -1194,13 +1194,15 @@ namespace minsky } } } - sumx.setArgument(spreadX,args); + auto mask=[](double x, double y){return isfinite(x) && isfinite(y);}; + auto fx=[](double x, double y){return isfinite(x) && isfinite(y)? x:0;}; auto fxy=[](double x, double y){return isfinite(x) && isfinite(y)? x*y: 0;}; + auto maskedX=make_shared(fx,spreadX,y); + sumx.setArgument(maskedX,args); sumyy.setArgument(make_shared(fxy,y,y),args); - sumxx.setArgument(make_shared(fxy,spreadX,spreadX),args); + sumxx.setArgument(make_shared(fxy,maskedX,spreadX),args); sumxy.setArgument(make_shared(fxy,y,spreadX),args); - count.setArgument - (make_shared([](double x,double y) {return isfinite(x)*isfinite(y);},y,spreadX),args); + count.setArgument(make_shared(mask,y,spreadX),args); assert(sumx.hypercube()==sumy.hypercube()); assert(sumx.index()==sumy.index()); From bbc579434583e91181aaf29d2fcb6328226c9895 Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Thu, 9 Apr 2026 17:33:24 +1000 Subject: [PATCH 2/5] Address code review concerns --- engine/minskyTensorOps.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/engine/minskyTensorOps.cc b/engine/minskyTensorOps.cc index 4730d9830..1af94339f 100644 --- a/engine/minskyTensorOps.cc +++ b/engine/minskyTensorOps.cc @@ -1160,7 +1160,6 @@ namespace minsky dimension=i-xv.begin(); } - sumy.setArgument(y,args); TensorPtr spreadX; if (x) { @@ -1195,10 +1194,12 @@ namespace minsky } } auto mask=[](double x, double y){return isfinite(x) && isfinite(y);}; - auto fx=[](double x, double y){return isfinite(x) && isfinite(y)? x:0;}; - auto fxy=[](double x, double y){return isfinite(x) && isfinite(y)? x*y: 0;}; + auto fx=[mask](double x, double y){return mask(x,y)? x:0;}; + auto fxy=[mask](double x, double y){return mask(x,y)? x*y: 0;}; auto maskedX=make_shared(fx,spreadX,y); + auto maskedY=make_shared(fx,y,spreadX); sumx.setArgument(maskedX,args); + sumy.setArgument(maskedY,args); sumyy.setArgument(make_shared(fxy,y,y),args); sumxx.setArgument(make_shared(fxy,maskedX,spreadX),args); sumxy.setArgument(make_shared(fxy,y,spreadX),args); From bff0c30c8d24ef6e1aacd0628e6361cfb7266cae Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 9 Apr 2026 07:41:16 +0000 Subject: [PATCH 3/5] Add unit test for sparse linear regression with NaN/Inf values in y when x is derived from x-vector Agent-Logs-Url: https://github.com/highperformancecoder/minsky/sessions/af68bc6c-5736-4b28-b042-2bcf698ddc71 Co-authored-by: highperformancecoder <3075825+highperformancecoder@users.noreply.github.com> --- test/testTensorOps.cc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/test/testTensorOps.cc b/test/testTensorOps.cc index b9cda33d6..f2a17d78d 100644 --- a/test/testTensorOps.cc +++ b/test/testTensorOps.cc @@ -1844,6 +1844,28 @@ TEST_F(CorrelationSuite,xvectorValueLinearRegression) for (size_t _i=0; _i{0,1,2,3,4,5}); + TensorVal y(hc); y=vector{1, std::numeric_limits::quiet_NaN(), 3, 4, + std::numeric_limits::infinity(), 6}; + fromVal=y; + + // finite pairs: (x=0,y=1),(x=2,y=3),(x=3,y=4),(x=5,y=6) => line y=x+1 + vector result={1,2,3,4,5,6}; + + OperationPtr op(OperationType::linearRegression); + g->addItem(op); + Wire w1(from->ports(0),op->ports(1)), w3(op->ports(0),to->ports(1)); + Eval(*to, op)(); + + auto& toVal=*to->vValue(); + EXPECT_EQ(result.size(), toVal.size()); + for (size_t _i=0; _i Date: Thu, 9 Apr 2026 17:43:48 +1000 Subject: [PATCH 4/5] Mask out sumyy as well, per Coderabbit suggestion --- engine/minskyTensorOps.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/minskyTensorOps.cc b/engine/minskyTensorOps.cc index 1af94339f..7d8884c55 100644 --- a/engine/minskyTensorOps.cc +++ b/engine/minskyTensorOps.cc @@ -1200,7 +1200,7 @@ namespace minsky auto maskedY=make_shared(fx,y,spreadX); sumx.setArgument(maskedX,args); sumy.setArgument(maskedY,args); - sumyy.setArgument(make_shared(fxy,y,y),args); + sumyy.setArgument(make_shared(fxy,maskedY,y),args); sumxx.setArgument(make_shared(fxy,maskedX,spreadX),args); sumxy.setArgument(make_shared(fxy,y,spreadX),args); count.setArgument(make_shared(mask,y,spreadX),args); From 1c7a0469929e9a84f118cfa0f30c03cc2856425f Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Fri, 10 Apr 2026 16:58:31 +1000 Subject: [PATCH 5/5] Address code review comments --- test/testTensorOps.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testTensorOps.cc b/test/testTensorOps.cc index f2a17d78d..4f6c45dd2 100644 --- a/test/testTensorOps.cc +++ b/test/testTensorOps.cc @@ -1862,7 +1862,7 @@ TEST_F(CorrelationSuite,xvectorValueLinearRegressionSparse) Eval(*to, op)(); auto& toVal=*to->vValue(); - EXPECT_EQ(result.size(), toVal.size()); + ASSERT_EQ(result.size(), toVal.size()); for (size_t _i=0; _i