'FreeRV' object cannot be interpreted as an integer

Hi everyone,
I have a data set [0,0,0,…1,1,1,1,…1,1,0,…0], and i want to know when it start and when it stop. so i wrote a model as follows:

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
import seaborn as sns
import arviz as az
import numpy as np
import pymc3 as pm
import os
import theano
import theano.tensor as tt
from theano.compile.ops import as_op


data_x4=np.ones(20)


data_y4_1=np.zeros(5)
data_y4_2=np.ones(10)
data_y4_3=np.zeros(5)
data_x4_pre=np.zeros(20)
data_y4=np.append(data_y4_1,data_y4_2)
data_y4=np.append(data_y4,data_y4_3)
data_x4=theano.shared(data_x4)
data_y4=theano.shared(data_y4)


with pm.Model() as model:
    #z = pm.DiscreteUniform('z',lower =0,upper=5,transform=None)
    #z=tt.clip(z, 0, 5)
    start = pm.Categorical('start', p=np.ones(10)/10)
    stop_t = pm.Categorical('stop_t', p=np.ones(10)/10)
    stop=pm.Deterministic("stop",stop_t+10)
    
    for i in range(20):
        data_x4_pre[i]=0
    for i in range(start,stop):
        data_x4_pre[i]=1
    
    Y = pm.Normal('Y',mu=data_x4_pre,sigma=1,observed=data_y4)
    trace=pm.sample(1000) 

and an error come out.

Traceback (most recent call last):

  File "<ipython-input-33-e9f25260044b>", line 23, in <module>
    for i in range(start,stop):

TypeError: 'FreeRV' object cannot be interpreted as an integer

is there any suggestion? thanks a lot.

You cannot use it in range as that is a python function that does not know what to do with random variables. You can try creating a. theano tensor with 20 zeros via x4=tt.zeros(20) and fill in the ones via x4 = tt.set_subtensor(x4[start:stop], 1).

This seems to work

   ...: data_x4=np.ones(20) 
   ...:  
   ...: data_y4_1=np.zeros(5) 
   ...: data_y4_2=np.ones(10) 
   ...: data_y4_3=np.zeros(5) 
   ...: #data_x4_pre=np.zeros(20) 
   ...: data_y4=np.append(data_y4_1,data_y4_2) 
   ...: data_y4=np.append(data_y4,data_y4_3) 
   ...: #data_x4=theano.shared(data_x4) 
   ...: data_y4=theano.shared(data_y4) 
   ...:  
   ...:  
   ...: with pm.Model() as model: 
   ...:     #z = pm.DiscreteUniform('z',lower =0,upper=5,transform=None) 
   ...:     #z=tt.clip(z, 0, 5) 
   ...:     start = pm.Categorical('start', p=np.ones(10)/10) 
   ...:     stop_t = pm.Categorical('stop_t', p=np.ones(10)/10) 
   ...:     stop=pm.Deterministic("stop",stop_t+10) 
   ...:      
   ...:     data_x4 = tt.zeros(20) 
   ...:     data_x4 = tt.set_subtensor(data_x4[start:stop], 1) 
   ...:     #for i in range(20): 
   ...:         #data_x4_pre[i]=0 
   ...:     #for i in range(start,stop): 
   ...:         #data_x4_pre[i]=1 
   ...:      
   ...:     Y = pm.Normal('Y',mu=data_x4_pre,sigma=1,observed=data_y4) 

Thanks.
Your answer is quiut helpful for me.