import numpy as np

from Link import Link

class RubberBand:
    # class attributes
    k_B = 1
    
    def __init__(self, N, a=1., T=1.):
        """
        RubberBand is a class that can simulate a rubber band with N
        incompressible links of length a.

        Parameters:
            N (int)     The number of links.
            a (float)   The fixed length of links.
            T (float)   Temperature of the system.
        """

        self.N = N
        self.a = a
        self.T = T
        self.links = self.__sample_links()

    def w(self, f, l):
        beta = (self.k_B*self.T)**(-1)
        return np.exp(beta*f*l)
    
    @property
    def length(self):
        return self.a * np.sum([l.direction for l in self.links])
    
    def __sample_links(self):
        """
        Sample N Link objects with a random direction.
        """

        samples = np.random.random_sample((self.N,))
        directions = np.ones(samples.shape)
        directions[samples < 0.5] = -1.
        directions = directions.astype(int)
        return [Link(d) for d in directions]