working on permutation
This commit is contained in:
		
							parent
							
								
									41e9c359d5
								
							
						
					
					
						commit
						1e83fcfaf9
					
				@ -727,6 +727,55 @@ return value;
 | 
			
		||||
#undef MAXBINOM
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template <typename T, typename R>
 | 
			
		||||
PermutationAlgebra<T,R> PermutationAlgebra<T,R>::operator&(const PermutationAlgebra<T,R> &rhs) const
 | 
			
		||||
{
 | 
			
		||||
PermutationAlgebra<T,R> res(this->size()*rhs.size());
 | 
			
		||||
for(int i=0; i<this->size(); ++i)
 | 
			
		||||
	for(int j=0; j<rhs.size(); ++j)
 | 
			
		||||
		res[i*rhs.size()+j] = (*this)[i]&rhs[j];
 | 
			
		||||
return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T, typename R>
 | 
			
		||||
PermutationAlgebra<T,R> PermutationAlgebra<T,R>::operator|(const PermutationAlgebra<T,R> &rhs) const
 | 
			
		||||
{
 | 
			
		||||
PermutationAlgebra<T,R> res(this->size()*rhs.size());
 | 
			
		||||
for(int i=0; i<this->size(); ++i)
 | 
			
		||||
        for(int j=0; j<rhs.size(); ++j)
 | 
			
		||||
                res[i*rhs.size()+j] = (*this)[i]|rhs[j];
 | 
			
		||||
return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T, typename R>
 | 
			
		||||
PermutationAlgebra<T,R> PermutationAlgebra<T,R>::operator*(const PermutationAlgebra<T,R> &rhs) const
 | 
			
		||||
{
 | 
			
		||||
if(this->size()>0 && rhs.size()>0 && (*this)[0].perm.size()!=rhs[0].perm.size()) laerror("permutation sizes do not match");
 | 
			
		||||
PermutationAlgebra<T,R> res(this->size()*rhs.size());
 | 
			
		||||
for(int i=0; i<this->size(); ++i)
 | 
			
		||||
        for(int j=0; j<rhs.size(); ++j)
 | 
			
		||||
                res[i*rhs.size()+j] = (*this)[i]*rhs[j];
 | 
			
		||||
return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T, typename R>
 | 
			
		||||
PermutationAlgebra<T,R> PermutationAlgebra<T,R>::operator+(const PermutationAlgebra<T,R> &rhs) const
 | 
			
		||||
{
 | 
			
		||||
if(this->size()>0 && rhs.size()>0 && (*this)[0].perm.size()!=rhs[0].perm.size()) laerror("permutation sizes do not match");
 | 
			
		||||
return this->concat(rhs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template <typename T, typename R>
 | 
			
		||||
void PermutationAlgebra<T,R>::simplify()
 | 
			
		||||
{
 | 
			
		||||
copyonwrite();
 | 
			
		||||
sort();
 | 
			
		||||
//@@@@implement merging weights of identical permutations and resize like we did in qubithamiltonian with other stuff
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,6 @@ typedef   unsigned long long PERM_RANK_TYPE;
 | 
			
		||||
 | 
			
		||||
//permutations are always numbered from 1; offset is employed when applied to vectors and matrices
 | 
			
		||||
 | 
			
		||||
//TODO@@@ permutace - substitute jako multiplikace ale x[p[i]] = y[i] kde ale x a y nejsou prave permutace
 | 
			
		||||
 | 
			
		||||
namespace LA {
 | 
			
		||||
 | 
			
		||||
@ -42,6 +41,9 @@ template <typename T> class YoungTableaux;
 | 
			
		||||
template <typename T, typename R> class WeightPermutation;
 | 
			
		||||
template <typename T, typename R> class PermutationAlgebra;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//operator== != < > inherited from NRVec
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class NRPerm : public NRVec_from1<T> {
 | 
			
		||||
public:
 | 
			
		||||
@ -82,20 +84,65 @@ public:
 | 
			
		||||
	NRPerm pow(const int n) const {return power(*this,n);};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//this is not a class memeber due to double templating
 | 
			
		||||
//it is also possible to use member function permuted of NRVec(_from1)
 | 
			
		||||
template <typename T, typename X>
 | 
			
		||||
NRVec_from1<X> applypermutation(const NRPerm<T> &p, const NRVec_from1<X> &set, bool inverse=false)
 | 
			
		||||
{
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
if(p.size()!=set.size()) laerror("size mismatch in applypermutation");
 | 
			
		||||
#endif
 | 
			
		||||
NRVec_from1<X> r(set.size());
 | 
			
		||||
if(inverse) for(int i=1; i<p.size(); ++i) r[p[i]] = set[i];
 | 
			
		||||
else for(int i=1; i<p.size(); ++i) r[i] = set[p[i]];
 | 
			
		||||
return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template <typename T, typename R> 
 | 
			
		||||
class WeightPermutation {
 | 
			
		||||
public:
 | 
			
		||||
	R weight;
 | 
			
		||||
	NRPerm<T> perm;
 | 
			
		||||
	
 | 
			
		||||
	int size() const {return perm.size();};
 | 
			
		||||
	bool is_plaindata() const {return false;};
 | 
			
		||||
	WeightPermutation() : weight(0) {};
 | 
			
		||||
	WeightPermutation(const R w, const NRPerm<T> &p) : weight(w), perm(p) {};
 | 
			
		||||
	WeightPermutation(const NRPerm<T> &p) : perm(p) {weight= p.parity();};
 | 
			
		||||
	void copyonwrite() {perm.copyonwrite();};
 | 
			
		||||
	WeightPermutation  operator&(const WeightPermutation &rhs) const {return WeightPermutation(weight*rhs.weight,perm&rhs.perm);};
 | 
			
		||||
	WeightPermutation  operator|(const WeightPermutation &rhs) const {return WeightPermutation(weight*rhs.weight,perm|rhs.perm);};
 | 
			
		||||
	WeightPermutation  operator*(const WeightPermutation &rhs) const {return WeightPermutation(weight*rhs.weight,perm*rhs.perm);};
 | 
			
		||||
	WeightPermutation operator*(const R &x) const {return WeightPermutation(weight*x,perm); }
 | 
			
		||||
//@@@operator+ and - yielding Permutationalgebra
 | 
			
		||||
 | 
			
		||||
	bool operator==(const WeightPermutation &rhs) const {return this->perm == rhs.perm;}; //NOTE for sorting, compares only the permutation not the weight!
 | 
			
		||||
	bool operator>(const WeightPermutation &rhs) const {return  this->perm > rhs.perm;};
 | 
			
		||||
        bool operator<(const WeightPermutation &rhs) const {return  this->perm < rhs.perm;};
 | 
			
		||||
        bool operator>=(const WeightPermutation &rhs) const {return !(*this < rhs);};
 | 
			
		||||
        bool operator<=(const WeightPermutation &rhs) const {return !(*this > rhs);};
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//some necessary traits of the non-scalar class to be able to use LA methods
 | 
			
		||||
template<typename T, typename R>
 | 
			
		||||
class LA_traits<WeightPermutation<T,R> > {
 | 
			
		||||
public: 
 | 
			
		||||
        static bool is_plaindata() {return false;};
 | 
			
		||||
        static void copyonwrite(WeightPermutation<T,R>& x) {x.perm.copyonwrite();};
 | 
			
		||||
	typedef typename LA_traits<R>::normtype  normtype;
 | 
			
		||||
	static inline bool smaller(const WeightPermutation<T,R>& x, const WeightPermutation<T,R>& y) {return x.perm<y.perm;};
 | 
			
		||||
	static inline bool bigger(const WeightPermutation<T,R>& x, const WeightPermutation<T,R>& y) {return x.perm>y.perm;};
 | 
			
		||||
	
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template <typename T, typename R>
 | 
			
		||||
std::istream & operator>>(std::istream &s, WeightPermutation<T,R> &x)
 | 
			
		||||
{
 | 
			
		||||
@ -118,10 +165,21 @@ class PermutationAlgebra : public NRVec<WeightPermutation<T,R> >
 | 
			
		||||
public:
 | 
			
		||||
	PermutationAlgebra() {};
 | 
			
		||||
	PermutationAlgebra(int n) : NRVec<WeightPermutation<T,R> >(n) {};
 | 
			
		||||
	PermutationAlgebra(const NRVec<WeightPermutation<T,R> > &x) :  NRVec<WeightPermutation<T,R> >(x) {};
 | 
			
		||||
	int size() const {return NRVec<WeightPermutation<T,R> >::size();};
 | 
			
		||||
	void copyonwrite() {NRVec<WeightPermutation<T,R> >::copyonwrite();};
 | 
			
		||||
	void sort(int direction = 0, int from = 0, int to = -1, int *permut = NULL, bool stable=false) {NRVec<WeightPermutation<T,R> >::sort(direction,from, to,permut,stable);};
 | 
			
		||||
 | 
			
		||||
	PermutationAlgebra operator&(const PermutationAlgebra &rhs) const;
 | 
			
		||||
	PermutationAlgebra operator|(const PermutationAlgebra &rhs) const;
 | 
			
		||||
	PermutationAlgebra operator*(const PermutationAlgebra &rhs) const; 
 | 
			
		||||
	PermutationAlgebra operator+(const PermutationAlgebra &rhs) const;
 | 
			
		||||
	PermutationAlgebra &operator*=(const R &x) {this->copyonwrite(); for(int i=1; i<=size(); ++i) (*this)[i].weight *= x; return *this;};
 | 
			
		||||
	PermutationAlgebra operator*(const R &x) const {PermutationAlgebra r(*this); return r*=x;};
 | 
			
		||||
	void simplify(); 
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//TODO@@@ basic operators for the algebra, possibly also simplification after operation
 | 
			
		||||
//TODO@@@ also simplification after operation
 | 
			
		||||
 | 
			
		||||
//TODO@@@ permutationalgebra  for Kucharski style antisymmetrizers
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										7
									
								
								t.cc
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								t.cc
									
									
									
									
									
								
							@ -2218,8 +2218,11 @@ NRPerm<int> p(n);
 | 
			
		||||
NRVec_from1<int> classes; cin>>classes;
 | 
			
		||||
if(classes.size()!=p.size()) laerror("sizes do not match");
 | 
			
		||||
PermutationAlgebra<int,int> tot = p.list_restricted(classes,-2);
 | 
			
		||||
cout <<"generated\n"<<tot<<endl;
 | 
			
		||||
cout <<"ALL\n"<<p.list_all();
 | 
			
		||||
tot.copyonwrite();
 | 
			
		||||
cout <<"generated " <<tot.size()<<"\n"<<tot<<endl;
 | 
			
		||||
PermutationAlgebra<int,int> all= p.list_all();
 | 
			
		||||
all.sort();
 | 
			
		||||
cout <<"ALL\n"<<all;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								vec.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								vec.h
									
									
									
									
									
								
							@ -253,6 +253,17 @@ public:
 | 
			
		||||
		return r;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
        NRVec concatscaled(const NRVec &rhs,  const T alpha=1) const
 | 
			
		||||
                {
 | 
			
		||||
                if(nn==0) return rhs;
 | 
			
		||||
                if(rhs.nn==0) return *this;
 | 
			
		||||
                NRVec r(nn+rhs.nn);
 | 
			
		||||
                for(int i=0; i<nn; ++i) r[i] = (*this)[i];
 | 
			
		||||
                for(int i=0; i<rhs.nn; ++i) r[nn+i] = rhs[i]*alpha;
 | 
			
		||||
                return r;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	//!concatenate vector into *this 
 | 
			
		||||
	void concatme(const NRVec &rhs) 
 | 
			
		||||
		{
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user