Program Listing for File binary_state.hpp¶
↰ Return to documentation for file (src_ed/binary_state.hpp)
#ifndef BinaryState_h
#define BinaryState_h
#include <cstdio>
#include <string>
#include <map>
#include <cstdint>
using namespace std;
uint32_t bitcount32(uint32_t n);
uint64_t bitcount64(uint64_t n);
void BinaryToString(size_t n, char *s, size_t m);
void PrintBinaryDouble(std::ostream &flux, const uint64_t &n, size_t m);
uint64_t collapse(const uint64_t &b, const vector<int> &s);
struct binary_state
{
uint64_t b; // the 64 bit representation (max 32 sites, because of spin)
static uint64_t leftmask; // mask for the left part of the state (spin up)
static uint64_t rightmask; // mask for the left part of the state (spin down)
binary_state(): b(0) {}
binary_state(uint64_t _b): b(_b) {}
binary_state(uint32_t L, uint32_t R): b((uint64_t)R+((uint64_t)L<<32)) {}
binary_state(uint32_t R): b((uint64_t)R){}
binary_state(const binary_state &bin): b(bin.b) {}
inline size_t count(){return bitcount64(b);}
inline uint32_t left() const {return (uint32_t)(b >> 32);}
inline uint32_t right() const {return (uint32_t)(b&rightmask);}
inline size_t double_occupancy() {return bitcount32(left()&right());}
inline int interphase(uint64_t i, uint64_t j)
{
if(i==j) return 1;
uint64_t mask_inside = (i>j)? (i-(j<<1)) : (j-(i<<1));
return (bitcount64(mask_inside&b)&1) ? -1 : 1;
}
int one_body(uint64_t b, uint64_t a);
int pair_annihilate(uint64_t i, uint64_t j);
int pair_create(uint64_t i, uint64_t j);
static void flip_spin(uint64_t &x)
{
uint64_t tmp = x&rightmask;
x >>= 32;
x += (tmp << 32);
}
static inline uint64_t mask(size_t i, size_t _n)
{
return (i >= _n) ? (uint64_t(1) << (i-_n+32)) : (uint64_t(1) << i);
}
};
inline bool operator==(const binary_state &b1, const binary_state &b2){return (b1.b==b2.b);}
inline bool operator<(const binary_state &b1, const binary_state &b2){return (b1.b<b2.b);}
inline bool operator>(const binary_state &b1, const binary_state &b2){return (b1.b>b2.b);}
#endif