From b24cd247476b7915c3398d1b242d42bb15c30c31 Mon Sep 17 00:00:00 2001 From: Jiri Pittner Date: Thu, 6 Nov 2025 15:45:12 +0100 Subject: [PATCH] tensor: scalar as rank==0 special case --- t.cc | 37 ++++++++++++++++++++++++++++++++++++- tensor.cc | 18 ++++++++++-------- tensor.h | 4 ++-- 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/t.cc b/t.cc index dd77fb3..22153ab 100644 --- a/t.cc +++ b/t.cc @@ -3362,7 +3362,7 @@ for(int i=0; i t(2.),u(3.); +cout <>r>>n; +INDEXGROUP shape; + { + shape.number=r; + //shape.symmetry= 0; + shape.symmetry= -1; + shape.range=n; + shape.offset=0; + } +Tensor x(shape); +x.randomize(1.); +cout< xf=x.flatten(); +cout < *>(&shape))[i]; - if(sh->number<=0) laerror("empty index group"); //we do not support scalar as a trivial case + if(sh->number<=0) laerror("empty index group"); //scalar must have shape.size()==0, not empty index group r+=sh->number; } myrank=r; @@ -46,7 +46,7 @@ return r; template LA_largeindex Tensor::calcsize() { -if(shape.size()==0) laerror("tensor must have rank at least 1"); +if(shape.size()==0) return 1; //scalar groupsizes.resize(shape.size()); cumsizes.resize(shape.size()); LA_largeindex s=1; @@ -578,6 +578,7 @@ std::ostream & operator<<(std::ostream &s, const Tensor &x) { s<); return s; @@ -1383,25 +1384,26 @@ loopover(permutationalgebra_callback2); template void Tensor::split_index_group(int group) { +const indexgroup *sh = &(* const_cast *>(&shape))[0]; if(group<0||group >= shape.size()) laerror("illegal index group number"); -if(shape[group].number==1) return; //nothing to split -if(shape[group].symmetry!=0) laerror("only non-symmetric index group can be splitted, use flatten instead"); +if(sh[group].number==1) return; //nothing to split +if(sh[group].symmetry!=0) laerror("only non-symmetric index group can be splitted, use flatten instead"); -NRVec newshape(shape.size()+shape[group].number-1); +NRVec newshape(shape.size()+sh[group].number-1); int gg=0; for(int g=0; g &s) : shape(s) { data.resize(calcsize()); calcrank();}; //general tensor Tensor(const NRVec &s, const NRVec &newnames) : shape(s), names(newnames) { data.resize(calcsize()); calcrank(); if(names.size()!=myrank && names.size()!=0) laerror("bad number of index names");}; //general tensor Tensor(const NRVec &s, const NRVec &mydata) : shape(s) { LA_largeindex dsize=calcsize(); calcrank(); if(mydata.size()!=dsize) laerror("inconsistent data size with shape"); data=mydata;}