import numpy as np

# Citim datele ca un string și le convertim în array de numere
with open('datebinare.txt', 'r') as f:
    data_string = f.read().strip()
    binary_data = np.array([int(bit) for bit in data_string])

# Verificăm datele
print("Forma datelor:", binary_data.shape)
print("Primele 10 valori:", binary_data[:10])

# Parametri Q-learning
alpha = 0.1  # rata de învățare
gamma = 0.9  # factor de discount
epsilon = 0.1  # probabilitate pentru explorare
n_episodes = 1000

# Inițializăm Q-table
Q = np.zeros((2, 2))  

# Training
for episode in range(n_episodes):
    state = binary_data[0]  # starea inițială
    
    for t in range(len(binary_data)-1):
        # Epsilon-greedy pentru alegerea acțiunii
        if np.random.random() < epsilon:
            action = np.random.randint(2)
        else:
            action = np.argmax(Q[state])
            
        # Următoarea stare și recompensa
        next_state = binary_data[t+1]
        reward = 1 if action == next_state else 0
        
        # Actualizare Q-value
        Q[state, action] = Q[state, action] + alpha * (reward + gamma * np.max(Q[next_state]) - Q[state, action])
        
        state = next_state

print("\nQ-table finală:")
print(Q)

# Testare
correct = 0
total = 0
state = binary_data[0]
for t in range(len(binary_data)-1):
    action = np.argmax(Q[state])
    next_state = binary_data[t+1]
    if action == next_state:
        correct += 1
    total += 1
    state = next_state

accuracy = correct/total * 100
print(f"\nAcuratețe pe datele de antrenament: {accuracy:.2f}%")

# Afișăm și câteva predicții
print("\nExemple de predicții:")
for i in range(10):
    state = binary_data[i]
    prediction = np.argmax(Q[state])
    actual = binary_data[i+1]
    print(f"Stare: {state}, Predicție: {prediction}, Valoare reală: {actual}")
