Program Listing for File binary_state.cpp

Return to documentation for file (src_ed/binary_state.cpp)

#include <vector>
#include <iostream>

#include "binary_state.hpp"

uint64_t binary_state::rightmask = ((1L<<32) - 1);
uint64_t binary_state::leftmask = binary_state::rightmask<<32;




int binary_state::one_body(uint64_t i, uint64_t j)
{
    if(b&j or !(b&i)) return(0);
    b = b - i + j;
    return interphase(i,j);
}






int binary_state::pair_annihilate(uint64_t i, uint64_t j)
{
    if(!(b&i) or !(b&j)) return(0);
    int pauli = 1;
    b = b - i - j;
    if(i<j) pauli = -1;
    return pauli*interphase(i,j);
}





int binary_state::pair_create(uint64_t i, uint64_t j)
{
  if((b&i) or (b&j)) return(0);
  int pauli = 1;
  b = b + i + j;
  if(i>j) pauli = -1;
  return pauli*interphase(i,j);
}







void BinaryToString(size_t n, char *s, size_t m)
{
    size_t i, k;
    k=1;
    for(i=0; i<m; ++i){
        s[i] = n&k ? '1' : '0';
        k <<= 1;
    }
    s[m] = 0;
}






void PrintBinaryDouble(ostream &flux, const uint64_t &n, size_t m)
{
    char s[m+1];
  BinaryToString(n,s,m);
    flux << '|' << s << ',';
  BinaryToString(n >> 32,s,m);
    flux << s << '>';
}




uint32_t bitcount32(uint32_t u)
{
    uint32_t uCount;

    uCount = u
    - ((u >> 1) & 033333333333)
    - ((u >> 2) & 011111111111);
    return (((uCount + (uCount >> 3)) & 030707070707) % 63);
}






const uint64_t m1  = 0x5555555555555555; //binary: 0101...
const uint64_t m2  = 0x3333333333333333; //binary: 00110011..
const uint64_t m4  = 0x0f0f0f0f0f0f0f0f; //binary:  4 zeros,  4 ones ...
const uint64_t m8  = 0x00ff00ff00ff00ff; //binary:  8 zeros,  8 ones ...
const uint64_t m16 = 0x0000ffff0000ffff; //binary: 16 zeros, 16 ones ...
const uint64_t m32 = 0x00000000ffffffff; //binary: 32 zeros, 32 ones
                                         // const uint64_t hff = 0xffffffffffffffff; //binary: all ones
                                         // const uint64_t h01 = 0x0101010101010101; //the sum of 256 to the power of 0,1,2,3...

uint64_t bitcount64(uint64_t x) {
    x = (x & m1 ) + ((x >>  1) & m1 ); //put count of each  2 bits into those  2 bits
    x = (x & m2 ) + ((x >>  2) & m2 ); //put count of each  4 bits into those  4 bits
    x = (x & m4 ) + ((x >>  4) & m4 ); //put count of each  8 bits into those  8 bits
    x = (x & m8 ) + ((x >>  8) & m8 ); //put count of each 16 bits into those 16 bits
    x = (x & m16) + ((x >> 16) & m16); //put count of each 32 bits into those 32 bits
    x = (x & m32) + ((x >> 32) & m32); //put count of each 64 bits into those 64 bits
    return x;
}



uint64_t collapse(const uint64_t &b, const vector<int> &s)
{
    uint64_t c = 0L;
    for(int i=0; i<s.size(); i++){
        uint64_t I = (1L << i);
        uint64_t k = (1L << s[i]);
        if (b&k) c += I;
        k = (k << 32);
        I = (I << 32);
        if (b&k) c += I;
    }
    // cout << "(";
    // for(int i=0; i<s.size(); i++) cout << s[i] << ", ";
    // cout <<  ") : ";
    // PrintBinaryDouble(cout, b, 4); cout << "\t";
    // PrintBinaryDouble(cout, c, s.size()); cout << "\n";

    return c;
}