Tensor class initial commit
This commit is contained in:
		
							parent
							
								
									46ac5380eb
								
							
						
					
					
						commit
						3f442212e0
					
				@ -1,6 +1,6 @@
 | 
				
			|||||||
lib_LTLIBRARIES = libla.la
 | 
					lib_LTLIBRARIES = libla.la
 | 
				
			||||||
include_HEADERS = version.h miscfunc.h simple.h vecmat3.h quaternion.h fortran.h cuda_la.h auxstorage.h  davidson.h   laerror.h    mat.h          qsort.h             vec.h bisection.h   diis.h       la.h         noncblas.h     smat.h numbers.h bitvector.h   fourindex.h  la_traits.h la_random.h  nonclass.h     sparsemat.h sparsesmat.h csrmat.h conjgrad.h    gmres.h      matexp.h     permutation.h   polynomial.h contfrac.h graph.h reg.h regsurf.h
 | 
					include_HEADERS = version.h tensor.h miscfunc.h simple.h vecmat3.h quaternion.h fortran.h cuda_la.h auxstorage.h  davidson.h   laerror.h    mat.h          qsort.h             vec.h bisection.h   diis.h       la.h         noncblas.h     smat.h numbers.h bitvector.h   fourindex.h  la_traits.h la_random.h  nonclass.h     sparsemat.h sparsesmat.h csrmat.h conjgrad.h    gmres.h      matexp.h     permutation.h   polynomial.h contfrac.h graph.h reg.h regsurf.h
 | 
				
			||||||
libla_la_SOURCES = simple.cc miscfunc.cc quaternion.cc vecmat3.cc vec.cc mat.cc smat.cc sparsemat.cc sparsesmat.cc csrmat.cc laerror.cc noncblas.cc  numbers.cc bitvector.cc strassen.cc nonclass.cc cuda_la.cc fourindex.cc permutation.cc polynomial.cc contfrac.cc graph.cc la_random.cc reg.cc regsurf.cc
 | 
					libla_la_SOURCES = simple.cc tensor.cc miscfunc.cc quaternion.cc vecmat3.cc vec.cc mat.cc smat.cc sparsemat.cc sparsesmat.cc csrmat.cc laerror.cc noncblas.cc  numbers.cc bitvector.cc strassen.cc nonclass.cc cuda_la.cc fourindex.cc permutation.cc polynomial.cc contfrac.cc graph.cc la_random.cc reg.cc regsurf.cc
 | 
				
			||||||
nodist_libla_la_SOURCES = version.cc
 | 
					nodist_libla_la_SOURCES = version.cc
 | 
				
			||||||
check_PROGRAMS = t test tX test_reg test_regsurf
 | 
					check_PROGRAMS = t test tX test_reg test_regsurf
 | 
				
			||||||
t_SOURCES = t.cc t2.cc 
 | 
					t_SOURCES = t.cc t2.cc 
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										1
									
								
								la.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								la.h
									
									
									
									
									
								
							@ -45,6 +45,7 @@
 | 
				
			|||||||
#include "vec.h"
 | 
					#include "vec.h"
 | 
				
			||||||
#include "polynomial.h"
 | 
					#include "polynomial.h"
 | 
				
			||||||
#include "contfrac.h"
 | 
					#include "contfrac.h"
 | 
				
			||||||
 | 
					#include "tensor.h"
 | 
				
			||||||
#include "version.h"
 | 
					#include "version.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace LA;
 | 
					using namespace LA;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										30
									
								
								tensor.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								tensor.cc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					    LA: linear algebra C++ interface library
 | 
				
			||||||
 | 
					    Copyright (C) 2024 Jiri Pittner <jiri.pittner@jh-inst.cas.cz> or <jiri@pittnerovi.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					    the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					    (at your option) any later version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					    GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "tensor.h"
 | 
				
			||||||
 | 
					#include "laerror.h"
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace LA {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}//namespace
 | 
				
			||||||
							
								
								
									
										103
									
								
								tensor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								tensor.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,103 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					    LA: linear algebra C++ interface library
 | 
				
			||||||
 | 
					    Copyright (C) 2024 Jiri Pittner <jiri.pittner@jh-inst.cas.cz> or <jiri@pittnerovi.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					    the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					    (at your option) any later version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					    GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//a simple tensor class with arbitrary summetry of index subgroups
 | 
				
			||||||
 | 
					//stored in an efficient way
 | 
				
			||||||
 | 
					//presently only a rudimentary implementation
 | 
				
			||||||
 | 
					//presently limited to 2G data size due to NRVec - maybe use a typedef LA_index 
 | 
				
			||||||
 | 
					//to uint64_t in the future in vector and matrix classes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _TENSOR_H
 | 
				
			||||||
 | 
					#define _TENSOR_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include "vec.h"
 | 
				
			||||||
 | 
					#include "miscfunc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace LA {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef int LA_index;
 | 
				
			||||||
 | 
					typedef int LA_largeindex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef class indexgroup {
 | 
				
			||||||
 | 
					int number; //number of indices
 | 
				
			||||||
 | 
					int symmetry; //-1 0 or 1
 | 
				
			||||||
 | 
					LA_index offset; //indices start at
 | 
				
			||||||
 | 
					LA_index size;  //indices span this range
 | 
				
			||||||
 | 
					} INDEXGROUP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					class Tensor {
 | 
				
			||||||
 | 
						NRVec<indexgroup> shape;
 | 
				
			||||||
 | 
						NRVec<T> data;	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
						Tensor() {};
 | 
				
			||||||
 | 
						Tensor(const NRVec<indexgroup> &s) : shape(s), data((int)size()) {data.clear();};
 | 
				
			||||||
 | 
						int rank() const; //is computed from shape
 | 
				
			||||||
 | 
						LA_largeindex size() const; //expensive, is computed from shape
 | 
				
			||||||
 | 
						void copyonwrite() {shape.copyonwrite(); data.copyonwrite();};
 | 
				
			||||||
 | 
						//@@@operator() lhs and rhs both via vararg a via superindex of flat and nested types, get/put to file, stream i/o
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					int Tensor<T>:: rank() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					int r=0;
 | 
				
			||||||
 | 
					for(int i=0; i<shape.size(); ++i)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
						if(shape[i].number==0) laerror("empty index group");
 | 
				
			||||||
 | 
						r+=shape[i].number;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					return r;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					LA_largeindex Tensor<T>::size() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					LA_largeindex s=1;
 | 
				
			||||||
 | 
					for(int i=0; i<shape.size(); ++i)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						if(shape[i].number==0) laerror("empty index group");
 | 
				
			||||||
 | 
						if(shape[i].size==0) return 0;
 | 
				
			||||||
 | 
						switch(shape[i].symmetry) 
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							case 0:
 | 
				
			||||||
 | 
								s *= longpow(shape[i].size,shape[i].number);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 1:
 | 
				
			||||||
 | 
								s *= binom(shape[i].size+shape[i].number-1,shape[i].number);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case -1:
 | 
				
			||||||
 | 
								s *= binom(shape[i].size,shape[i].number);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default: 
 | 
				
			||||||
 | 
								laerror("illegal index group symmetry");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					return s;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}//namespace
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user