From 16d36d0d46556d7c2eb45101820b63b67707831e Mon Sep 17 00:00:00 2001 From: L Laniewski-Wollk Date: Thu, 30 May 2024 16:08:10 +1000 Subject: [PATCH 1/3] Adding autosym2 to makefile --- src/makefile.main.Rt | 2 +- src/models.R | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/makefile.main.Rt b/src/makefile.main.Rt index aa7297e52..8125b9cf4 100644 --- a/src/makefile.main.Rt +++ b/src/makefile.main.Rt @@ -154,7 +154,7 @@ for (d in destinations) { paste0(" ", names(opts), " = ", - ifelse(opts==0,"FALSE","TRUE"), + opts, ifelse(seq_along(opts) != length(opts),",","") ) ) diff --git a/src/models.R b/src/models.R index b4db6571f..98cf69650 100644 --- a/src/models.R +++ b/src/models.R @@ -47,11 +47,23 @@ get.models = function() { opts_terms = terms(opts) opts = attr(opts_terms,"factors") opts = data.frame(t(opts)) - rownames(opts) = paste(name,gsub(":","_",rownames(opts)),sep="_") + opts[] = opts > 0 if (attr(opts_terms, "intercept") == 1) { - opts[name,]=0 + opts = rbind(opts, FALSE) } -# opts = apply(opts, 2, function(x) x > 0) + if ("autosym" %in% names(opts)) { + opts$autosym = ifelse(opts$autosym, 1, 0) + x = opts[opts$autosym > 0,,drop=FALSE] + x$autosym = 2 + opts = rbind(opts, x) + } + rownames(opts) = sapply(seq_len(nrow(opts)), function(i) { + x = opts[i,] + w = names(opts) + w = paste0(w, ifelse(x>1,x,"")) + w = c(name, w[x>0]) + paste(w,collapse="_") + }) } else { opts = data.frame(row.names=name) } From 10cf9a57d0b9a85e5937e882c59a61d60e021b3c Mon Sep 17 00:00:00 2001 From: L Laniewski-Wollk Date: Thu, 30 May 2024 16:44:20 +1000 Subject: [PATCH 2/3] Correcting the ranges for fields with symmetries --- src/conf.R | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/conf.R b/src/conf.R index df5eac128..a905d7e37 100644 --- a/src/conf.R +++ b/src/conf.R @@ -33,7 +33,7 @@ if (! SYMALGEBRA) { library(symAlgebra,quietly=TRUE,warn.conflicts=FALSE) } -if (is.null(Options$autosym)) Options$autosym = FALSE +if (is.null(Options$autosym)) Options$autosym = 0 #source("linemark.R") @@ -370,7 +370,7 @@ if (is.null(Description)) { } -if (Options$autosym) { ## Automatic symmetries +if (Options$autosym > 0) { ## Automatic symmetries symmetries = data.frame(symX=c(-1,1,1),symY=c(1,-1,1),symZ=c(1,1,-1)) for (g in unique(DensityAll$group)) { @@ -399,6 +399,24 @@ if (Options$autosym) { ## Automatic symmetries Fields[sel,s] = Fields$name[sel] } + rownames(Fields) = Fields$name + ranges = c("minx","maxx","miny","maxy","minz","maxz") + + tmp = -1234 + while (any(Fields[,ranges] != tmp)) { + tmp = Fields[,ranges] + for (f in rownames(Fields)) { + r = Fields[f,ranges] + for (s in names(symmetries)) { + nf = Fields[f,s] + or = Fields[nf,ranges] + nr = r * rep(symmetries[,s],each=2) + cr = c(range(or[1:2],nr[1:2]),range(or[1:2+2],nr[1:2+2]),range(or[1:2+4],nr[1:2+4])) + Fields[nf,ranges] = cr + } + } + } + AddNodeType("SymmetryX_plus", group="SYMX") AddNodeType("SymmetryX_minus", group="SYMX") AddNodeType("SymmetryY_plus", group="SYMY") From f4c66ff6dccbbda8dcd6504fa0a1edf2482537ff Mon Sep 17 00:00:00 2001 From: L Laniewski-Wollk Date: Fri, 31 May 2024 13:13:25 +1000 Subject: [PATCH 3/3] Working autosym2 --- src/LatticeAccess.inc.cpp.Rt | 42 ++++++++++++++++++------ src/conf.R | 63 +++++++++++++++++++++++++----------- 2 files changed, 78 insertions(+), 27 deletions(-) diff --git a/src/LatticeAccess.inc.cpp.Rt b/src/LatticeAccess.inc.cpp.Rt index 283dfb2f0..b252855ea 100644 --- a/src/LatticeAccess.inc.cpp.Rt +++ b/src/LatticeAccess.inc.cpp.Rt @@ -34,6 +34,10 @@ #define real_to_storage_shift(x__,y__) real_to_storage(x__) #endif +#ifndef NODE_SYMZ + #define NODE_SYMZ 0 +#endif + /// Get only type of node CudaDeviceFunction flag_t LatticeContainer::getType(int x, int y, int z) const { @@ -417,8 +421,10 @@ public: si = which(Fields$name == fn) sf = rows(Fields)[[si]] - sd = d - sd[i] = sd[i]*(-1) + sd_plus = d + sd_plus[i] = autosym_shift-sd_plus[i] + sd_minus = d + sd_minus[i] = -autosym_shift-sd_minus[i] ?> template < class PARENT > template @@ -426,12 +432,12 @@ CudaDeviceFunction real_t SymmetryAccess< PARENT >:: if ( > range_int<0>()) { - if ((this->getNodeType() & NODE_SYM) == NODE_Symmetry_plus) { - return (); + if ((this->getNodeType() & NODE_SYM) == NODE__plus) { + return (); } } else if ( < range_int<0>()) { - if ((this->getNodeType() & NODE_SYM) == NODE_Symmetry_minus) { - return (); + if ((this->getNodeType() & NODE_SYM) == NODE__minus) { + return (); } } @@ -444,9 +450,27 @@ CudaDeviceFunction real_t SymmetryAccess< PARENT >:: template CudaDeviceFunction void SymmetryAccess< PARENT >::pop(N & node) const -{ - parent::pop(node); - +{ + parent::pop(node); + parent::pop(node); + if (this->getNodeType() & (NODE_SYMX | NODE_SYMY | NODE_SYMZ)) { + = load_(range_int< >(),range_int< >(),range_int< >()); + = ; + } else { + parent::pop(node); + } } diff --git a/src/conf.R b/src/conf.R index a905d7e37..901544373 100644 --- a/src/conf.R +++ b/src/conf.R @@ -400,32 +400,59 @@ if (Options$autosym > 0) { ## Automatic symmetries } rownames(Fields) = Fields$name - ranges = c("minx","maxx","miny","maxy","minz","maxz") - tmp = -1234 - while (any(Fields[,ranges] != tmp)) { - tmp = Fields[,ranges] - for (f in rownames(Fields)) { - r = Fields[f,ranges] - for (s in names(symmetries)) { - nf = Fields[f,s] - or = Fields[nf,ranges] - nr = r * rep(symmetries[,s],each=2) - cr = c(range(or[1:2],nr[1:2]),range(or[1:2+2],nr[1:2+2]),range(or[1:2+4],nr[1:2+4])) - Fields[nf,ranges] = cr + if (Options$autosym == 1) { + autosym_shift = 0 + autosym_name = "Symmetry" + } else if (Options$autosym == 2) { + autosym_shift = 1 + autosym_name = "SymmetryEdge" + } else stop("unknown autosym value") + + directions = lapply(rows(Fields), function(f) expand.grid(dx=f$minx:f$maxx,dy=f$miny:f$maxy,dz=f$minz:f$maxz)) + names(directions) = Fields$name + dir.sort = function(d) { + d = unique(d) + d[order(d[,3],d[,2],d[,1]),] + } + directions = lapply(directions,dir.sort) + tmp = NULL + while (!identical(directions, tmp)) { + tmp = directions + for (f in rows(Fields)) { + d = directions[[f$name]] + for (i in 1:3) { + nfn = f[[names(symmetries)[i]]] + od = directions[[nfn]] + cr = od + nd = d[d[,i] < 0,, drop=FALSE] + nd[,i] = -nd[,i] - autosym_shift + cr = rbind(cr,nd) + nd = d[d[,i] > 0,, drop=FALSE] + nd[,i] = -nd[,i] + autosym_shift + cr = rbind(cr,nd) + directions[[nfn]] = cr } } + directions = lapply(directions,dir.sort) } + Fields$minx = sapply(directions, function(x) min(x$dx)) + Fields$maxx = sapply(directions, function(x) max(x$dx)) + Fields$miny = sapply(directions, function(x) min(x$dy)) + Fields$maxy = sapply(directions, function(x) max(x$dy)) + Fields$minz = sapply(directions, function(x) min(x$dz)) + Fields$maxz = sapply(directions, function(x) max(x$dz)) - AddNodeType("SymmetryX_plus", group="SYMX") - AddNodeType("SymmetryX_minus", group="SYMX") - AddNodeType("SymmetryY_plus", group="SYMY") - AddNodeType("SymmetryY_minus", group="SYMY") + + AddNodeType(paste0(autosym_name, "X_plus"), group="SYMX") + AddNodeType(paste0(autosym_name, "X_minus"), group="SYMX") + AddNodeType(paste0(autosym_name, "Y_plus"), group="SYMY") + AddNodeType(paste0(autosym_name, "Y_minus"), group="SYMY") if (all(range(Fields$minz,Fields$maxz) == c(0,0))) { # we're in 2D } else { - AddNodeType("SymmetryZ_plus", group="SYMZ") - AddNodeType("SymmetryZ_minus", group="SYMZ") + AddNodeType(paste0(autosym_name, "Z_plus"), group="SYMZ") + AddNodeType(paste0(autosym_name, "Z_minus"), group="SYMZ") } }