ConwayLife.com - A community for Conway's Game of Life and related cellular automata
Home  •  LifeWiki  •  Forums  •  Download Golly

How to install additional libraries in Python (e.g., numpy)

For scripts to aid with computation or simulation in cellular automata.

How to install additional libraries in Python (e.g., numpy)

Postby KittyTac » September 15th, 2018, 11:55 am

shouldsee wrote:The fixed "mutate.py" takes the current rulestring and flips a random hensel configuration. It depends on the messy collection "KBs.py" and please place them in the same folder.

mutate.py

## Written by Feng (shouldsee.gem@gmail.com) March 2018.
import golly
import KBs

import random


# rulestr=golly.getstring('NTCA number',golly.getclipstr()).split('_')[-1];
kb = KBs.kb_2dntca()
# alias = golly.getrule()
curr=golly.getrule().split(':')
if len(curr)==1:
   curr+=['']
alias,suffix = curr

rulestr = kb.alias2rulestr(alias)
bitstr = KBs.hex2bin(rulestr,102)
# assert KBs.bin2hex(bitstr)==rulestr
bitlst = list(bitstr)

idx =  random.randint(0,102)
flip = {'0':'1','1':'0'}
bitlst[idx] = flip[bitlst[idx]]
rulestr = KBs.bin2hex(''.join(bitlst))
alias = kb.rulestr2alias(rulestr)


golly.note(alias)
golly.setclipstr(alias)

golly.setrule('%s:%s'%(alias,suffix))


KBs.py

import numpy as np
import pickle
import itertools, collections, re
import copy
import random
import collections
count = collections.Counter
identity = lambda x:x
# import collections
base2bin=lambda data,scale,num_of_bits: bin(int(data, scale))[2:].zfill(num_of_bits);
hex2bin=lambda hexdata,num_of_bits: base2bin(hexdata,16,num_of_bits);
bin2hex = lambda bitstr:hex(int(bitstr,2)).lstrip('0x').rstrip('L')

# from astropy.convolution import convolve
# convolve_int=lambda a,fir,method:np.around(convolve(a,fir,method)).astype(np.int);
import scipy.ndimage
convolve_int=lambda a,fir,method,**kwargs:scipy.ndimage.filters.convolve(a,fir,mode = method,**kwargs)

hensellist=['b0_','b1c','b1e','b2a','b2c','b3i','b2e','b3a','b2k','b3n','b3j','b4a','s0_','s1c','s1e','s2a','s2c','s3i','s2e','s3a','s2k','s3n','s3j','s4a','b2i','b3r','b3e','b4r','b4i','b5i','s2i','s3r','s3e','s4r','s4i','s5i','b2n','b3c','b3q','b4n','b4w','b5a','s2n','s3c','s3q','s4n','s4w','s5a','b3y','b3k','b4k','b4y','b4q','b5j','b4t','b4j','b5n','b4z','b5r','b5q','b6a','s3y','s3k','s4k','s4y','s4q','s5j','s4t','s4j','s5n','s4z','s5r','s5q','s6a','b4e','b5c','b5y','b6c','s4e','s5c','s5y','s6c','b5k','b6k','b6n','b7c','s5k','s6k','s6n','s7c','b4c','b5e','b6e','s4c','s5e','s6e','b6i','b7e','s6i','s7e','b8_','s8_',];
rca2ntca=[0, 1, 2, 3, 1, 4, 3, 5, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 13, 16, 15, 17, 14, 15, 18, 19, 20, 21, 22, 23, 2, 8, 6, 10, 3, 9, 7, 11, 24, 25, 26, 27, 25, 28, 27, 29, 14, 20, 18, 22, 15, 21, 19, 23, 30, 31, 32, 33, 31, 34, 33, 35, 1, 4, 8, 9, 36, 37, 38, 39, 3, 5, 10, 11, 38, 39, 40, 41, 13, 16, 20, 21, 42, 43, 44, 45, 15, 17, 22, 23, 44, 45, 46, 47, 8, 48, 49, 50, 38, 51, 52, 53, 25, 54, 55, 56, 57, 58, 59, 60, 20, 61, 62, 63, 44, 64, 65, 66, 31, 67, 68, 69, 70, 71, 72, 73, 2, 8, 24, 25, 8, 48, 25, 54, 6, 10, 26, 27, 49, 50, 55, 56, 14, 20, 30, 31, 20, 61, 31, 67, 18, 22, 32, 33, 62, 63, 68, 69, 6, 49, 26, 55, 10, 50, 27, 56, 26, 55, 74, 75, 55, 76, 75, 77, 18, 62, 32, 68, 22, 63, 33, 69, 32, 68, 78, 79, 68, 80, 79, 81, 3, 9, 25, 28, 38, 51, 57, 58, 7, 11, 27, 29, 52, 53, 59, 60, 15, 21, 31, 34, 44, 64, 70, 71, 19, 23, 33, 35, 65, 66, 72, 73, 10, 50, 55, 76, 40, 82, 59, 83, 27, 56, 75, 77, 59, 83, 84, 85, 22, 63, 68, 80, 46, 86, 72, 87, 33, 69, 79, 81, 72, 87, 88, 89, 1, 36, 8, 38, 4, 37, 9, 39, 8, 38, 49, 52, 48, 51, 50, 53, 13, 42, 20, 44, 16, 43, 21, 45, 20, 44, 62, 65, 61, 64, 63, 66, 3, 38, 10, 40, 5, 39, 11, 41, 25, 57, 55, 59, 54, 58, 56, 60, 15, 44, 22, 46, 17, 45, 23, 47, 31, 70, 68, 72, 67, 71, 69, 73, 4, 37, 48, 51, 37, 90, 51, 91, 9, 39, 50, 53, 51, 91, 82, 92, 16, 43, 61, 64, 43, 93, 64, 94, 21, 45, 63, 66, 64, 94, 86, 95, 9, 51, 50, 82, 39, 91, 53, 92, 28, 58, 76, 83, 58, 96, 83, 97, 21, 64, 63, 86, 45, 94, 66, 95, 34, 71, 80, 87, 71, 98, 87, 99, 3, 38, 25, 57, 9, 51, 28, 58, 10, 40, 55, 59, 50, 82, 76, 83, 15, 44, 31, 70, 21, 64, 34, 71, 22, 46, 68, 72, 63, 86, 80, 87, 7, 52, 27, 59, 11, 53, 29, 60, 27, 59, 75, 84, 56, 83, 77, 85, 19, 65, 33, 72, 23, 66, 35, 73, 33, 72, 79, 88, 69, 87, 81, 89, 5, 39, 54, 58, 39, 91, 58, 96, 11, 41, 56, 60, 53, 92, 83, 97, 17, 45, 67, 71, 45, 94, 71, 98, 23, 47, 69, 73, 66, 95, 87, 99, 11, 53, 56, 83, 41, 92, 60, 97, 29, 60, 77, 85, 60, 97, 85, 100, 23, 66, 69, 87, 47, 95, 73, 99, 35, 73, 81, 89, 73, 99, 89, 101];
henseldict={'0': ['_'],
'1': ['c', 'e'],
'2': ['a', 'c', 'e', 'k', 'i', 'n'],
'3': ['i', 'a', 'n', 'j', 'r', 'e', 'c', 'q', 'y', 'k'],
'4': ['a', 'r', 'i', 'n', 'w', 'k', 'y', 'q', 't', 'j', 'z', 'e', 'c'],
'5': ['i', 'a', 'j', 'n', 'r', 'q', 'c', 'y', 'k', 'e'],
'6': ['a', 'c', 'k', 'n', 'e', 'i'],
'7': ['c', 'e'],
'8': ['_']}


rca2ntca=np.array(rca2ntca,np.int);
henselidx={k: v for v, k in enumerate(hensellist)};
subconf='_cekainyqjrtwz';
p_NOTnumletter = re.compile(r'[^\da-zA-Z\-]')   

try:
    from data import *
    with open('tp','rb') as f:  # Python 3: open(..., 'rb')
       hdist, tst_data = pickle.load(f)
       hdist = np.array(hdist).reshape([512,512]);
except:
    print('[WARN]Not finding data.py')




def invert(s):
    num = s[0]
    conf = henseldict[num]
    return ''.join([num]+[x for x in conf if x not in s])

def ntuple(lst,n):
    """ntuple([0,3,4,10,2,3], 2) => [(0,3), (4,10), (2,3)]
   
    Group a list into consecutive n-tuples. Incomplete tuples are
    discarded e.g.
   
    >>> group(range(10), 3)
    [(0, 1, 2), (3, 4, 5), (6, 7, 8)]
    """   
    return zip(*[lst[i::n] for i in range(n)])

def add_all(s,prime,sold,neg=0):
    for c in subconf:
        conf=prime+sold+c;
        try:
            s[henselidx[conf]]=str(1-neg);
        except KeyError:
            pass
class kb_2dntca():
    def __init__(self):
        self.familyname='2dntca'
        pass
    def rulestr2alias(self, rulestr):
        OUT = ''
        # rulestr =  '000000000060031c61c67f86a0'
        r=hex2bin(rulestr,102);
        r=r[::-1];
        rule=[i for i,x in enumerate(r) if x=='1'];
#         print r
        lst = [hensellist[i] for i in rule]
        lst.sort()
       
        #### group by B/S
        d = collections.OrderedDict((('b',{}),('s',{}))) ### set default
#         d = {'b':{},'s':{}}   ### set default
        d.update(
            {k:list(gp) for k,gp in itertools.groupby(lst, lambda x:x[0])}       
        )
        for k,lst in d.items():
            d[k] = {k:list(gp) for k,gp in itertools.groupby(lst, lambda x:x[1])}
           
        for bs, dd in d.items():
            OUT += bs
            for k,lst in dd.items():
                OUT += k + ''.join( conf[-1] for conf in lst)
        OUT = OUT.replace('_','')
        alias = OUT
        return alias


    def alias2rulestr(self,alias):
    # alias.replace('-','')
        alias = re.sub('(\d-[a-zA-Z]+)',lambda o:invert(o.group()),alias)
        alias = p_NOTnumletter.sub( '', alias).lower()
        OUT = ['0']*102
        d = collections.OrderedDict((('b',{}),('s',{}))) ### set default
        # d.update()
        # alias.split('s')
        s = alias
        lst = [x for x  in re.split("([bs])", s) if x]
        if len(lst) % 2: #### Padding to even length
            lst += ['']
        d  = dict(ntuple(lst,2))
        idxs = []
        for k, v in d.items():
            s = v
            lst = [x for x in re.split("(\d)", s) if x]
            L  = len(lst)
            v_old = ''
            for i,v in enumerate(lst):
                if v.isdigit():
                    if v_old.isdigit():
                        idx = [henselidx.get( k + v_old + c,None) for c in subconf]
                        idxs.extend(idx)
                    if i + 1 == L:
                        idx = [henselidx.get( k + v + c,None) for c in subconf]
                        idxs.extend(idx)
                    num = v
                else:
                    idx = [henselidx[ k + num + v_i]  for v_i in v ]
                    idxs.extend(idx)
                v_old = v
        idxs = [ x for x in idxs if x is not None]
        for i in idxs:
            if not i is None:
                OUT[i] = '1'
        bitstr=''.join(OUT[::-1]);
        hexstr=hex(int(bitstr,2)).lstrip('0x').rstrip('L').zfill(26)
        return hexstr
#     def alias2rulestr(self, alias):
#         alias = p_NOTnumletter.sub( '', alias).lower()
#         OUT = ['0']*102
#         # print alias
#         d = collections.OrderedDict((('b',{}),('s',{}))) ### set default
#         # d.update()
#         # alias.split('s')
#         s = alias
#         lst = [x for x  in re.split("([bs])", s) if x]
#         if len(lst) % 2: #### Padding to even length
#             lst += ['']
#         d  = dict(ntuple(lst,2))
#         idxs = []
#         for k, v in d.items():
#             s = v
#             lst = [x for x in re.split("(\d)", s) if x]
#             L  = len(lst)
#             v_old = ''
#             for i,v in enumerate(lst):
#                 if v.isdigit():
#                     if v_old.isdigit():
#                         idx = [henselidx.get( k + v_old + c,None) for c in subconf]
#                         idxs.extend(idx)
#                     if i + 1 == L:
#                         idx = [henselidx.get( k + v + c,None) for c in subconf]
#                         idxs.extend(idx)
#                     num = v
#                 else:
#                     idx = [henselidx[ k + num + v_i]  for v_i in v ]
#                     idxs.extend(idx)
#                 v_old = v
#         idxs = [ x for x in idxs if x is not None]
#         for i in idxs:
#             if not i is None:
#                 OUT[i] = '1'
#         bitstr=''.join(OUT[::-1]);
#         hexstr=hex(int(bitstr,2)).lstrip('0x').rstrip('L').zfill(26)
#         return hexstr
    def rulestr2adv(self,rulestr):
        ruleprj=np.array(
            list(hex2bin(rulestr,102)[::-1]),
            np.int);
        adv = self.bin2adv(ruleprj)
#         ruleprj=np.array(list(hex2bin(rulestr,102)[::-1]));
#         fir=(2**np.arange(0,9)).reshape([1,3,3]);
#         pj=rca2ntca;
#         def adv(a,horizon):
#             return ruleprj[pj[convolve_int(a,fir,'wrap').astype(np.int)]]
#         # adv=lambda a, horizon: ruleprj[pj[convolve_int(a,fir,'wrap').astype(np.int)]]
        return adv
    def conv(self,a):
        fir=(2**np.arange(0,9)).reshape([1,3,3]);
        pj=rca2ntca;
        return pj[convolve_int(a,fir,'wrap').astype(np.int)]
    def bin2adv(self, ruleprj):
        if isinstance(ruleprj,str):
            ruleprj = list(ruleprj)
        ruleprj = np.array(ruleprj,np.int)
        def adv(a,horizon=0):
            return ruleprj[self.conv(a)]
        return adv
    def rstr(self,callback=(lambda x:bin2hex(x).zfill(26)) ):
        r = '{:0102b}'.format(random.randrange(2**102))
        if callback is not None:
            r = callback(r)
        return r
    def randadv(self):
        return self.bin2adv(self.rstr(None))
    def bulk_rstr(self,seed = 0,bsize=2**18,**kwargs):
        random.seed(seed)
        lst = [{'family':self.familyname,
                'rulestr':self.rstr(**kwargs)} for x in range(bsize)]
        return lst   
   
   
class kb_2dtca():
#     def rulestr2alias(rulestr):
#         r=base2bin(int(rulestr),18,2);
#         r=r[:1:-1];
#         r+='0'*(18-len(r));
#         rule=[i for x,i in zip(r,range(len(r))) if x=='1'];
#         alias='b';
#         ps=1;
#         for a in rule:
#             if a>8 and ps:
#                 alias+='s';
#                 ps=0;
#             alias+=str((a)%9)
#         if ps==1:
#             alias+='s';
#         return alias       
    def alias2rulestr(self, ali):
        rule=['0']*18;
        ali=ali.replace('/','').lower().lstrip('b');
        (b,s)=ali.split('s');
        lst=list(str(int(i)+9) for i in s);
        bs=list(b)+(lst)
        for i in bs:
            rule[int(i)]='1';
        rnum=(''.join(rule[::-1]),2);
        return(rnum);
    def rulestr2adv(self,rulestr):
        #take an numpy array and convolution across the axis=[1,2];
        # project the convolved array back to value space according to the rule
        #
        hex2bin(rulestr)
                                       
class CA_sys():
    def __init__(self,familyname = None,rulestr=None,dimsiz=None,adv=None,rdf=None):
#         siz=[600,100,400];
        if dimsiz is None:
            dimsiz = [128,128,32**2]
        if rulestr is None:
            rulestr = '0c83820e0060061941946a68f0'
        if familyname is None:
            familyname = '2dntca'
        self.familyname=familyname;
        self.rulestr=rulestr;
        self.adv=adv;
        self.dimsiz=dimsiz;
        self.change_size();
#         self.family = globals().get('familyname')
        self.family=eval('kb_%s()'%self.familyname);
        self.rulestr2alias()
#         self.
        if rdf==None:
            self.rdf=lambda:(np.random.random(self.siz)<=0.5).astype(np.int);

    def change_size(self,dimsiz=None):
        if dimsiz==None:
            dimsiz=self.dimsiz;
        N,hmax,ksq=dimsiz
        self.N=N;
        self.hmax=hmax;
        dd=int(ksq**0.5);
        self.siz = (N,dd,dd);
       
    def rulestr2alias(self):
#         kb=eval('kb_%s()'%self.familyname);
        # kb=eval('kb_%s'%self.familyname);
        self.alias=self.family.rulestr2alias(self.rulestr);
        self.adv=self.family.rulestr2adv(self.rulestr);
    def alias2rulestr(self):
#         kb=eval('kb_%s()'%self.familyname);
        # kb=eval('kb_%s'%self.familyname);
        self.rulestr=self.family.alias2rulestr(self.alias)
        self.adv    =self.family.rulestr2adv(self.rulestr)           
    def as_config(self):
        conf = {'family':self.family.familyname,
               'rulestr':self.rulestr,
                'alias':self.alias,}
        return conf
#     def change_adv(familyname,rulestr):

kb=kb_2dntca();
# kb.rulestr2alias('000000000060031c61c67f86a0')
kb.alias2rulestr('b3/s23')

   
# @function

# @function
def measure_temperature(sys0=None,hdist=None,*args,**kwargs):
#     varargin = measure_temperature.varargin
#     nargin = measure_temperature.nargin
    sysX=copy.copy(sys0)
    jmax=sysX.N;
    avi=sysX.rdf().astype(np.int)
    siz=avi.shape
    siz=(sysX.hmax,)+siz;
    tmp=np.zeros(siz)
    smtmp=np.zeros(siz)

    avc=avi
    i=0
    fir=np.reshape(2 ** (np.arange(0,9)),[1,3,3])
    trans=6
    mtp=0
    stp=0
    while i+1 < sysX.hmax:

        i=i + 1
        avcnew=(sysX.adv(avc,i))
        cavc=convolve_int(avc,fir,'wrap').astype(np.int);
        cavcnew=convolve_int(avcnew,fir,'wrap').astype(np.int);
        idx=np.ravel_multi_index((cavc,cavcnew),[2**9,2**9]);
        tmp[i,:,:,:]=np.expand_dims(hdist.flat[idx],0)
        if i >= trans:
            smtmpnow=np.mean(tmp[i - trans:i,:,:,:],axis=0)
            smtmp[i - trans,:,:,:]=smtmpnow
            if i >= trans + 10:
                mtp=np.mean(smtmpnow.flat)
                stpmat=((smtmp[i - trans,:,:,:] - smtmp[i - trans - trans,:,:,:]))
                a=np.mean(np.abs(stpmat.flat))
                b=abs(np.mean(stpmat.flat))
                stp=a - b
                stp1=np.mean(avcnew.flat)
                stp1=min(stp1,1 - stp1)
        avc=avcnew;
        #     im1=[avc(1,:,:)];
        if mtp < 0.02 and i > 20:
            break
   
    fam_alias=sys0.familyname+'_'+sys0.alias;
# /home/shouldsee/Documents/repos/CA_tfmat/custom_function/measure_temperature.m:55
    # s=sprintf('%s\\t%s\\t%d\\t%f\\t%f\\t%f\\n',fam_alias,num2str(sys0.od),i,mtp,stp,stp1)
    s='{}\t{}\t{:d}\t{:f}\t{:f}\t{:f}\n'.format(fam_alias,sysX.rulestr,i,mtp,stp,stp1)
# /home/shouldsee/Documents/repos/CA_tfmat/custom_function/measure_temperature.m:56
    return s
   
# if __name__ == '__main__':
#     pass
   


### Profiling loop
### Profiling loop
def profile(input_list, log = []):
    # global log
    output_data=[];   
    repeat=2;
    # input_list=[input_rulestr];
    ipt_list=input_list*repeat;
    # for i in range(5):
    l_ipt=len(input_list)
    log += ['Log of the process:'];
    logs='Starting to profile {:d} rules at {:d} replicates,\n totaling {:d} instances'.format(l_ipt,repeat,l_ipt*repeat);
    log += [logs];
    # print('Starting to profile {:d} rules at {:d} replicates,\n totaling {:d} instances'.format(l_ipt,repeat,l_ipt*repeat))

    for num,rulestr in enumerate(ipt_list):
        ca1=CA_sys(familyname,rulestr,[400,100,400]);
        ca1.rulestr2alias();
        s=measure_temperature(ca1,hdist);
        output_data+=[s];
    #     print('{:d} of {:d}'.format(num,len(ipt_list)))
        logs =('{:d} of {:d} '.format(num,len(ipt_list)));
        log += [logs];
    temp_data=[];
    # sample_data=[]
    for line in output_data:
        temp_data+=[line.rstrip('\n').split('\t')];
    sample_data=np.array(temp_data)
    # print('data is succesfully generated at {:d} replicates'.format(repeat))
    logs=('data is succesfully generated at {:d} replicates'.format(repeat))

    log  += [logs];

    # print('\n Detail of the input:')
    logs='\n Detail of the input:';
    log+=[logs];
    for k,v in ca1.__dict__.items():
        if not callable(v):
    #         print(k+str(v).ljust(-10))
    #         print("{:5} {:<15} {:<10}".format('',k, str(v)))

            logs=("{:5} {:<15} {:<10}".format('',k, str(v)));
            log+=[logs];
    return( [sample_data,log]);
   
if __name__ == '__main__':
    INPUT = "B345678/S012678"
    exp = "3f9fbe3e001fff07e07e15fea0"
    act = kb.alias2rulestr(INPUT)
    assert act == exp,'expected:%s, actual:%s' %(exp,act)
#     pass

def guess(i=None,sysX=None,dct=None):
    dimsiz = (256,2**7,24**2)
    if i is not None:
        rstr = tst_data[i][1]
        familyname='2dntca'
    if dct is not None:
        familyname = dct['family']
        rstr = dct['rulestr']
    if sysX is None:
        sysX = CA_sys(familyname,rstr,dimsiz)
        # sysX = KBs.CA_sys('2dntca',tst_data[i][1],(200,2**7,400))
        sysX.rulestr2alias()
    else:
        sysX.dimsiz = dimsiz
        sysX.change_size()# spspa.distance
    return sysX


import IPython.display as ipd
def lview(self):
    fmt = 'http://newflaw.com/view.php?rule_alias={:}'
    uri = fmt.format(self.alias)
    print uri
    ele = '<iframe src="{}" width=600 height=500></iframe>'.format(uri)
    ipd.display(ipd.HTML(ele))
    return uri


def sample(self,ini=None,adv = None):
    '''
    Sample an iterator ('CA_sys' object)
    '''
    if adv is None:
        adv = self.adv
    if ini is None:
        ini=self.rdf().astype(int)
    avc = ini
    hist = np.zeros((self.hmax,)+avc.shape,dtype=np.int)
    for i in range(self.hmax):
        hist[i]=avc
        avc=(adv(avc))
    return hist
def fill_ber(arr,p=0.5):
    '''
    Create bernouli using shape of arr
    '''
    return np.random.random(arr.shape) < p
def mix_adv(fA,fB,pa=0):
    '''
    Mixing two iterator
    '''
    if pa==1:
        adv = lambda arr:fA(arr)
    elif pa==0:
        adv = lambda arr:fB(arr)
    else:
        def adv(arr):
            mask = np.random.random(arr.shape)<pa
            A = fA(arr)
            B = fB(arr)
#             arr[mask] = A
#             arr[~mask] = B
            out = A*mask + B*(1-mask)
            return out
#             return arr
    return adv
def cov2cor(COV):
    D = np.diag(COV)
    COR = COV /  np.sqrt(D[:,None]*D[None,:])
    return COR


# Fast run length encoding
def rle (img):
    '''
    Source:https://www.kaggle.com/hackerpoet/even-faster-run-length-encoder
    '''
    x = np.ravel(img)
#     flat_img = img.flatten()
#     flat_img = np.where(flat_img > 0.5, 1, 0).astype(np.uint8)
    ### startswith 0->1
    ### endswith 1->0
    starts = np.array((x[:-1] == 0) & (x[1:] == 1))
    ends = np.array((x[:-1] == 1) & (x[1:] == 0))
    starts_ix = np.where(starts)[0] + 1
    ends_ix = np.where(ends)[0] + 1
    if x[0] == 1:
        starts_ix = np.insert(starts_ix,0,0)
    if x[-1] == 1:
        ends_ix = np.append(ends_ix,len(x))
    lengths = ends_ix - starts_ix
   
    return starts_ix, lengths
def _gollyrle(x):
    sl = rle(x)
    sym='bo$'
    S = 0
    out = ''
    L = 0
#     if s
    if sl[0].size!=0:
        for s,l1 in zip(*sl):
            l0 = s-S-L
            if l0>0:       
                inc = '%d%s'%(l0,sym[0]) ### number of zeros
                out = '%s%s'%(out,inc)
            inc = '%d%s'%(l1,sym[1])
            out = '%s%s'%(out,inc)
            S = s
            L = l1
    l0 = len(x)-S-L
    if l0>0:       
        inc = '%d%s'%(l0,sym[0]) ### number of zeros
        out = '%s%s'%(out,inc)
#     out='%s%s'%(out,sym[-1])
    return out
_gollyrle(map(int,list('010001001010')))
def gollyrle(arr):
    return '$'.join(map(_gollyrle,arr))
def hill(x):
    return 1-abs(2*x-1)
def sflatten(arr):
    return np.reshape(arr,(len(arr),-1))
def sexpand(arr,d=2):
    S = arr.shape
    root = int(round(S[1]**(1./d)) )
    out = np.reshape(arr,(S[0],)+(root,)*d)
    return out


def showsptime(arr,ax=None,**kwargs):
    if ax is None:
        fig,ax = plt.subplots(1,1,figsize=[12,4])   
    return ax.pcolormesh(sflatten(arr),**kwargs)
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import IPython.display as ipd
def animate(arr,html = 1,nFrame=20):
    '''
    Animate a list of 2d-array
    '''
    fig, ax = plt.subplots()
    im = ax.imshow(arr[0])
    ax.grid()
    data_gen = arr

    def run(data):
        im.set_data(data)
        return im,

    ani = animation.FuncAnimation(fig, run,
                                  data_gen,
                                  blit=False,
                                  interval=1000./nFrame,
                                  repeat=1, init_func=None)
    plt.close()
    if html:
        ani = ipd.HTML(ani.to_html5_video())
    return ani

It says that there is no module named "numpy". How to fix that?
User avatar
KittyTac
 
Posts: 533
Joined: December 21st, 2017, 9:58 am

Re: Golly scripts

Postby dvgrn » September 16th, 2018, 12:28 am

KittyTac wrote:Can anyone tell me the solution to my problem?

The numpy libraries aren't installed by default -- you have to download them, one way or another. Depends on your operating system. If it's Windows, I think I'd recommend that you try installing it via pip -- but that may mean you have to install pip first, if it's not there already. It will be there if your Python version is 2.7.9 or greater. Otherwise there are more installation instructions.

All slightly tedious, but ultimately pretty straightforward. If you run into any trouble, a Google search is very likely to turn up other people who had the exact same problem (and solved it)... but then, that's true for your original problem also.
User avatar
dvgrn
Moderator
 
Posts: 5327
Joined: May 17th, 2009, 11:00 pm
Location: Madison, WI

Re: Golly scripts

Postby Saka » September 16th, 2018, 12:30 am

KittyTac wrote:Can anyone tell me the solution to my problem?

Install numpy
You can do
pip install numpy


(dvgrn beat me but I'll post anyway :P )
If you're the person that uploaded to Sakagolue illegally, please PM me.
x = 17, y = 10, rule = B3/S23
b2ob2obo5b2o$11b4obo$2bob3o2bo2b3o$bo3b2o4b2o$o2bo2bob2o3b4o$bob2obo5b
o2b2o$2b2o4bobo2b3o$bo3b5ob2obobo$2bo5bob2o$4bob2o2bobobo!

(Check gen 2)
User avatar
Saka
 
Posts: 2766
Joined: June 19th, 2015, 8:50 pm
Location: In the kingdom of Sultan Hamengkubuwono X

Re: Golly scripts

Postby KittyTac » September 16th, 2018, 12:56 am

I need to install curl to install pip, but I need pip to install curl (no curl in Python 2.7)... what now?

Edit: I got get-pip.py, now where do I put it?

Edit2: It was installed.
User avatar
KittyTac
 
Posts: 533
Joined: December 21st, 2017, 9:58 am

Re: Golly scripts

Postby KittyTac » September 16th, 2018, 1:13 am

So, pip is there, but as soon as I run it, it closes. How to run it?
User avatar
KittyTac
 
Posts: 533
Joined: December 21st, 2017, 9:58 am

Re: Golly scripts

Postby 77topaz » September 16th, 2018, 3:48 am

Just type
pip install numpy

in the regular console you use for Python. For convenience, you could also consider downloading a package like Anaconda, which contains a lot of useful Python modules and GUIs.
User avatar
77topaz
 
Posts: 1328
Joined: January 12th, 2018, 9:19 pm

Re: How to install additional libraries in Python (e.g., numpy)

Postby KittyTac » September 17th, 2018, 7:59 am

>>> pip install numpy
  File "<stdin>", line 1
    pip install numpy
              ^
SyntaxError: invalid syntax

Help.
User avatar
KittyTac
 
Posts: 533
Joined: December 21st, 2017, 9:58 am

Re: How to install additional libraries in Python (e.g., numpy)

Postby Saka » September 17th, 2018, 8:44 am

KittyTac wrote:
>>> pip install numpy
  File "<stdin>", line 1
    pip install numpy
              ^
SyntaxError: invalid syntax

Help.

Run it in cmd.
To confirm this works, I ran it for myself.
pip.png
pip.png (22.15 KiB) Viewed 3215 times
If you're the person that uploaded to Sakagolue illegally, please PM me.
x = 17, y = 10, rule = B3/S23
b2ob2obo5b2o$11b4obo$2bob3o2bo2b3o$bo3b2o4b2o$o2bo2bob2o3b4o$bob2obo5b
o2b2o$2b2o4bobo2b3o$bo3b5ob2obobo$2bo5bob2o$4bob2o2bobobo!

(Check gen 2)
User avatar
Saka
 
Posts: 2766
Joined: June 19th, 2015, 8:50 pm
Location: In the kingdom of Sultan Hamengkubuwono X

Re: How to install additional libraries in Python (e.g., numpy)

Postby KittyTac » September 17th, 2018, 8:52 am

Wait, how did you do that? It says that it is not a cmd command or something along those lines. I'm on Windows 8.1 if that's any help.
User avatar
KittyTac
 
Posts: 533
Joined: December 21st, 2017, 9:58 am

Re: How to install additional libraries in Python (e.g., numpy)

Postby dvgrn » September 17th, 2018, 12:45 pm

KittyTac wrote:Wait, how did you do that? It says that it is not a cmd command or something along those lines. I'm on Windows 8.1 if that's any help.

If you always take the time to quote the actual error message instead of saying "something along those lines", it really helps in general. Also it gives you text that you can go search for yourself with Google. Probably not necessary in this case, but why take the risk?

-- I was hoping you wouldn't run into this issue. I _think_ it just means that your Windows PATH variable isn't updated to point to your Python folder.

But I'm getting annoying "Folder does not exist" and "Permission denied" error messages when I try to run get-pip.py on this particular laptop, so I can't test here until I fix that.

You might try the solution from this StackOverflow thread:

py -m pip install numpy
Worked for me!

what about py -m makes it work, and what do they do? Please explain your answer!

'py' is the python command line alias for windows that for one reason or another is sometimes set as a default during python installation. '-m' is mod option which allows you to run a library module as a script. 'py -m' instructs python to run the pip module as a script, passing the install and numpy keywords.

Failing that, search for "pip" on your hard drive and run the command from there -- e.g., type "cd C:\Python27 [Enter]", then "pip install numpy [Enter]".

-- Or try the variant from the quote above, or just "python.exe -m pip install numpy" for the second line. That skips the mysterious command-line alias stuff, which I've never heard of and shouldn't be necessary.
User avatar
dvgrn
Moderator
 
Posts: 5327
Joined: May 17th, 2009, 11:00 pm
Location: Madison, WI

Re: How to install additional libraries in Python (e.g., numpy)

Postby KittyTac » September 17th, 2018, 12:48 pm

I'm Russian, and the message is in Russian. So I won't be able to search StackOverflow with it.
User avatar
KittyTac
 
Posts: 533
Joined: December 21st, 2017, 9:58 am

Re: How to install additional libraries in Python (e.g., numpy)

Postby dvgrn » September 17th, 2018, 1:24 pm

KittyTac wrote:I'm Russian, and the message is in Russian. So I won't be able to search StackOverflow with it.

Okay, in that case it's definitely not worth messing with Windows' language settings to get a searchable chunk of text for that particular error message. Sometimes that might be useful, but here you're probably just seeing the equivalent of

C:\Users\{username}>pip install numpy
'pip' is not recognized as an internal or external command,
operable program or batch file.

Does that seem right? If so, you might just need to change directories to where pip actually is on your system, and run the command from there.
User avatar
dvgrn
Moderator
 
Posts: 5327
Joined: May 17th, 2009, 11:00 pm
Location: Madison, WI

Re: How to install additional libraries in Python (e.g., numpy)

Postby KittyTac » September 17th, 2018, 10:28 pm

dvgrn wrote:
KittyTac wrote:I'm Russian, and the message is in Russian. So I won't be able to search StackOverflow with it.

Okay, in that case it's definitely not worth messing with Windows' language settings to get a searchable chunk of text for that particular error message. Sometimes that might be useful, but here you're probably just seeing the equivalent of

C:\Users\{username}>pip install numpy
'pip' is not recognized as an internal or external command,
operable program or batch file.

Does that seem right? If so, you might just need to change directories to where pip actually is on your system, and run the command from there.

Yes, that's right. I will try it out.
User avatar
KittyTac
 
Posts: 533
Joined: December 21st, 2017, 9:58 am

Re: How to install additional libraries in Python (e.g., numpy)

Postby KittyTac » September 18th, 2018, 12:24 am

It worked! Thanks! But mutate.py still does not work. It doesn't even open.
User avatar
KittyTac
 
Posts: 533
Joined: December 21st, 2017, 9:58 am

Re: How to install additional libraries in Python (e.g., numpy)

Postby dvgrn » September 18th, 2018, 5:18 am

KittyTac wrote:It worked! Thanks! But mutate.py still does not work. It doesn't even open.

It depends on the messy collection "KBs.py" and please place them in the same folder.

Where did you put the two Python files, and what are their names? (Just checking.)

Do other Python scripts work now?

If mutate.py just flips a random isotropic bit, you don't need either numpy or Python to do that in Golly 3.x. There's an equivalent Lua script.
User avatar
dvgrn
Moderator
 
Posts: 5327
Joined: May 17th, 2009, 11:00 pm
Location: Madison, WI

Re: How to install additional libraries in Python (e.g., numpy)

Postby KittyTac » September 18th, 2018, 8:11 am

dvgrn wrote:
KittyTac wrote:It worked! Thanks! But mutate.py still does not work. It doesn't even open.

It depends on the messy collection "KBs.py" and please place them in the same folder.

Where did you put the two Python files, and what are their names? (Just checking.)

Do other Python scripts work now?

If mutate.py just flips a random isotropic bit, you don't need either numpy or Python to do that in Golly 3.x. There's an equivalent Lua script.

Scripts folder.

Yes.

Wait, there is?
User avatar
KittyTac
 
Posts: 533
Joined: December 21st, 2017, 9:58 am

Re: How to install additional libraries in Python (e.g., numpy)

Postby dvgrn » September 18th, 2018, 10:35 am

KittyTac wrote:
dvgrn wrote:
KittyTac wrote:It worked! Thanks! But mutate.py still does not work. It doesn't even open.

It depends on the messy collection "KBs.py" and please place them in the same folder.

Where did you put the two Python files, and what are their names? (Just checking.)
...
If mutate.py just flips a random isotropic bit, you don't need either numpy or Python to do that in Golly 3.x. There's an equivalent Lua script.

Wait, there is?

Yeah, it's pretty serious overkill to require two Python files plus the whole numpy library just to do that simple task.

At least, I _think_ the Lua script is more or less equivalent. Some testing would be appreciated... There are a few forbidden isotropic bits in the Lua version, just because flipping them is pretty much guaranteed to cause uninteresting explosions.
User avatar
dvgrn
Moderator
 
Posts: 5327
Joined: May 17th, 2009, 11:00 pm
Location: Madison, WI

Re: How to install additional libraries in Python (e.g., numpy)

Postby KittyTac » September 18th, 2018, 11:58 am

Yeah, I ran like 50 iterations of it and soups started exploding. Took 20 more to un-explodify it.
User avatar
KittyTac
 
Posts: 533
Joined: December 21st, 2017, 9:58 am

Re: How to install additional libraries in Python (e.g., numpy)

Postby dvgrn » September 18th, 2018, 12:15 pm

KittyTac wrote:Yeah, I ran like 50 iterations of it and soups started exploding. Took 20 more to un-explodify it.

That's normal (for either the Lua or Python script). The Lua script doesn't bother to flip b0, b1, or b2a, because those always cause explosions... and since there are 102 possible isotropic bits to flip, if you allow those to be flipped, the odds are very very low that that particular bit would randomly happen to get flipped back (before another one of those bits gets flipped and all patterns would keep exploding anyway).

For the record, for mutate.py I had to run

pip install numpy
pip install scipy
pip install IPython
pip install matplotlib

before the script stopped giving errors and actually ran. This seems like a really unreasonable number of unnecessary dependencies, given what the script actually seems to do. I'd definitely recommend the Lua script as a substitute.

In general if something can be written in Lua, it should be written in Lua, just because that way it will always Just Work in Golly 3.x, with no possibility of installation headaches (Python, pip, etc.)
User avatar
dvgrn
Moderator
 
Posts: 5327
Joined: May 17th, 2009, 11:00 pm
Location: Madison, WI


Return to Scripts

Who is online

Users browsing this forum: No registered users and 1 guest