TejAndrewsACC's picture
Update model.py
f39f7d5 verified
# coding=utf-8
# Copyright 2025 The ACC Team Authors and The HuggingFace Inc. team.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""ACC-FiPhi-NeuralMark-V3"""
import random
import math
import time
import os
PHI = (1 + math.sqrt(5)) / 2
text = os.getenv("FiPhi-NeuralMark-V3/TRAINING_DATA.txt")
words = text.split()
trigram_chain = {}
for i in range(len(words) - 2):
key = (words[i], words[i + 1])
next_word = words[i + 2]
if key not in trigram_chain:
trigram_chain[key] = []
trigram_chain[key].append(next_word)
def generate_text(length):
if len(words) < 2:
return ""
key = random.choice(list(trigram_chain.keys()))
result = [key[0], key[1]]
for _ in range(length - 2):
if key in trigram_chain:
next_word = random.choice(trigram_chain[key])
result.append(next_word)
key = (key[1], next_word)
else:
break
return " ".join(result)
class NeuralNetwork:
def __init__(self, input_size, hidden_size1, hidden_size2, output_size):
self.input_size = input_size
self.hidden_size1 = hidden_size1
self.hidden_size2 = hidden_size2
self.output_size = output_size
self.weights_input_hidden1 = [
[random.random() for _ in range(input_size)] for _ in range(hidden_size1)
]
self.weights_hidden1_hidden2 = [
[random.random() for _ in range(hidden_size1)] for _ in range(hidden_size2)
]
self.weights_hidden2_output = [
[random.random() for _ in range(hidden_size2)] for _ in range(output_size)
]
self.bias_hidden1 = [random.random() for _ in range(hidden_size1)]
self.bias_hidden2 = [random.random() for _ in range(hidden_size2)]
self.bias_output = [random.random() for _ in range(output_size)]
def sigmoid(self, x):
return 1 / (1 + math.exp(-x))
def sigmoid_derivative(self, x):
return x * (1 - x)
def forward(self, inputs):
self.hidden_input1 = [
sum(inputs[i] * self.weights_input_hidden1[j][i] for i in range(self.input_size)) + self.bias_hidden1[j]
for j in range(self.hidden_size1)
]
self.hidden_output1 = [self.sigmoid(x) for x in self.hidden_input1]
self.hidden_input2 = [
sum(self.hidden_output1[i] * self.weights_hidden1_hidden2[j][i] for i in range(self.hidden_size1)) + self.bias_hidden2[j]
for j in range(self.hidden_size2)
]
self.hidden_output2 = [self.sigmoid(x) for x in self.hidden_input2]
self.output_input = [
sum(self.hidden_output2[i] * self.weights_hidden2_output[j][i] for i in range(self.hidden_size2)) + self.bias_output[j]
for j in range(self.output_size)
]
self.output_output = [self.sigmoid(x) for x in self.output_input]
return self.output_output
def backward(self, inputs, target, learning_rate=0.1):
output_errors = [target[i] - self.output_output[i] for i in range(self.output_size)]
output_deltas = [output_errors[i] * self.sigmoid_derivative(self.output_output[i])
for i in range(self.output_size)]
hidden2_errors = [
sum(output_deltas[k] * self.weights_hidden2_output[k][j] for k in range(self.output_size))
for j in range(self.hidden_size2)
]
hidden2_deltas = [hidden2_errors[j] * self.sigmoid_derivative(self.hidden_output2[j])
for j in range(self.hidden_size2)]
hidden1_errors = [
sum(hidden2_deltas[k] * self.weights_hidden1_hidden2[k][j] for k in range(self.hidden_size2))
for j in range(self.hidden_size1)
]
hidden1_deltas = [hidden1_errors[j] * self.sigmoid_derivative(self.hidden_output1[j])
for j in range(self.hidden_size1)]
for i in range(self.output_size):
for j in range(self.hidden_size2):
self.weights_hidden2_output[i][j] += learning_rate * output_deltas[i] * self.hidden_output2[j]
self.bias_output[i] += learning_rate * output_deltas[i]
for i in range(self.hidden_size2):
for j in range(self.hidden_size1):
self.weights_hidden1_hidden2[i][j] += learning_rate * hidden2_deltas[i] * self.hidden_output1[j]
self.bias_hidden2[i] += learning_rate * hidden2_deltas[i]
for i in range(self.hidden_size1):
for j in range(self.input_size):
self.weights_input_hidden1[i][j] += learning_rate * hidden1_deltas[i] * inputs[j]
self.bias_hidden1[i] += learning_rate * hidden1_deltas[i]
class RecurrentNeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.weights_input_hidden = [
[random.random() for _ in range(input_size)] for _ in range(hidden_size)
]
self.weights_hidden_hidden = [
[random.random() for _ in range(hidden_size)] for _ in range(hidden_size)
]
self.weights_hidden_output = [
[random.random() for _ in range(hidden_size)] for _ in range(output_size)
]
self.bias_hidden = [random.random() for _ in range(hidden_size)]
self.bias_output = [random.random() for _ in range(output_size)]
def sigmoid(self, x):
return 1 / (1 + math.exp(-x))
def sigmoid_derivative(self, x):
return x * (1 - x)
def forward(self, inputs):
self.hidden_state = [0] * self.hidden_size
for _ in range(2):
for i in range(len(inputs)):
current_input = [0] * self.input_size
current_input[i] = inputs[i]
combined = [
sum(current_input[k] * self.weights_input_hidden[j][k] for k in range(self.input_size)) +
sum(self.hidden_state[k] * self.weights_hidden_hidden[j][k] for k in range(self.hidden_size)) +
self.bias_hidden[j]
for j in range(self.hidden_size)
]
self.hidden_state = [self.sigmoid(val) for val in combined]
output = [
sum(self.hidden_state[k] * self.weights_hidden_output[i][k] for k in range(self.hidden_size)) +
self.bias_output[i]
for i in range(self.output_size)
]
return [self.sigmoid(o) for o in output]
def backward(self, inputs, target, learning_rate=0.1):
output = self.forward(inputs)
output_errors = [target[i] - output[i] for i in range(self.output_size)]
output_deltas = [output_errors[i] * self.sigmoid_derivative(output[i])
for i in range(self.output_size)]
hidden_errors = [
sum(output_deltas[k] * self.weights_hidden_output[k][j] for k in range(self.output_size))
for j in range(self.hidden_size)
]
hidden_deltas = [hidden_errors[j] * self.sigmoid_derivative(self.hidden_state[j])
for j in range(self.hidden_size)]
for i in range(self.output_size):
for j in range(self.hidden_size):
self.weights_hidden_output[i][j] += learning_rate * output_deltas[i] * self.hidden_state[j]
self.bias_output[i] += learning_rate * output_deltas[i]
for j in range(self.hidden_size):
for k in range(self.input_size):
self.weights_input_hidden[j][k] += learning_rate * hidden_deltas[j] * (inputs[k] if k < len(inputs) else 0)
self.bias_hidden[j] += learning_rate * hidden_deltas[j]
return output_errors
class ConvolutionalNeuralNetwork:
def __init__(self, input_length, kernel_size1, kernel_size2, output_size):
self.input_length = input_length
self.kernel_size1 = kernel_size1
self.kernel_size2 = kernel_size2
self.output_size = output_size
self.kernel1 = [random.random() for _ in range(kernel_size1)]
self.bias1 = random.random()
self.kernel2 = [random.random() for _ in range(kernel_size2)]
self.bias2 = random.random()
self.weights_output = [
[random.random() for _ in range(input_length - kernel_size1 - kernel_size2 + 2)]
for _ in range(output_size)
]
self.bias_output = [random.random() for _ in range(output_size)]
def relu(self, x):
return x if x > 0 else 0
def relu_derivative(self, x):
return 1 if x > 0 else 0
def convolve(self, inputs, kernel, bias):
conv_output = []
kernel_size = len(kernel)
for i in range(len(inputs) - kernel_size + 1):
s = sum(inputs[i + j] * kernel[j] for j in range(kernel_size)) + bias
conv_output.append(self.relu(s))
return conv_output
def forward(self, inputs):
conv1 = self.convolve(inputs, self.kernel1, self.bias1)
conv2 = self.convolve(conv1, self.kernel2, self.bias2)
fc_input = conv2
output = [
sum(fc_input[j] * self.weights_output[i][j] for j in range(len(fc_input))) + self.bias_output[i]
for i in range(self.output_size)
]
return [self.relu(o) for o in output]
def backward(self, inputs, target, learning_rate=0.1):
output = self.forward(inputs)
output_errors = [target[i] - output[i] for i in range(self.output_size)]
for i in range(self.output_size):
for j in range(len(inputs) - self.kernel_size1 - self.kernel_size2 + 2):
self.weights_output[i][j] += learning_rate * output_errors[i]
self.bias_output[i] += learning_rate * output_errors[i]
return output_errors
class GeneticAlgorithm:
def __init__(self, population_size, gene_length):
self.population_size = population_size
self.gene_length = gene_length
self.population = [
[random.random() for _ in range(gene_length)] for _ in range(population_size)
]
def fitness(self, individual):
return -sum((gene - PHI) ** 2 for gene in individual)
def selection(self):
selected = sorted(self.population, key=self.fitness, reverse=True)
return selected[: self.population_size // 2]
def crossover(self, parent1, parent2):
point = random.randint(1, self.gene_length - 1)
child = parent1[:point] + parent2[point:]
return child
def mutate(self, individual, mutation_rate=0.01):
for i in range(self.gene_length):
if random.random() < mutation_rate:
individual[i] = random.random()
return individual
def evolve(self, generations):
for _ in range(generations):
selected = self.selection()
new_population = selected[:]
while len(new_population) < self.population_size:
parent1 = random.choice(selected)
parent2 = random.choice(selected)
child = self.crossover(parent1, parent2)
child = self.mutate(child)
new_population.append(child)
self.population = new_population
best = max(self.population, key=self.fitness)
return best, self.fitness(best)
class LSTM:
def __init__(self, input_size, hidden_size, output_size):
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.W_i = [[random.random() for _ in range(input_size)] for _ in range(hidden_size)]
self.U_i = [[random.random() for _ in range(hidden_size)] for _ in range(hidden_size)]
self.b_i = [random.random() for _ in range(hidden_size)]
self.W_f = [[random.random() for _ in range(input_size)] for _ in range(hidden_size)]
self.U_f = [[random.random() for _ in range(hidden_size)] for _ in range(hidden_size)]
self.b_f = [random.random() for _ in range(hidden_size)]
self.W_o = [[random.random() for _ in range(input_size)] for _ in range(hidden_size)]
self.U_o = [[random.random() for _ in range(hidden_size)] for _ in range(hidden_size)]
self.b_o = [random.random() for _ in range(hidden_size)]
self.W_c = [[random.random() for _ in range(input_size)] for _ in range(hidden_size)]
self.U_c = [[random.random() for _ in range(hidden_size)] for _ in range(hidden_size)]
self.b_c = [random.random() for _ in range(hidden_size)]
self.W_y = [[random.random() for _ in range(hidden_size)] for _ in range(output_size)]
self.b_y = [random.random() for _ in range(output_size)]
def sigmoid(self, x):
return 1 / (1 + math.exp(-x))
def forward(self, inputs):
h = [0] * self.hidden_size
c = [0] * self.hidden_size
i_gate = []
for j in range(self.hidden_size):
s = sum(inputs[k] * self.W_i[j][k] for k in range(self.input_size)) + \
sum(h[k] * self.U_i[j][k] for k in range(self.hidden_size)) + self.b_i[j]
i_gate.append(self.sigmoid(s))
f_gate = []
for j in range(self.hidden_size):
s = sum(inputs[k] * self.W_f[j][k] for k in range(self.input_size)) + \
sum(h[k] * self.U_f[j][k] for k in range(self.hidden_size)) + self.b_f[j]
f_gate.append(self.sigmoid(s))
o_gate = []
for j in range(self.hidden_size):
s = sum(inputs[k] * self.W_o[j][k] for k in range(self.input_size)) + \
sum(h[k] * self.U_o[j][k] for k in range(self.hidden_size)) + self.b_o[j]
o_gate.append(self.sigmoid(s))
g_gate = []
for j in range(self.hidden_size):
s = sum(inputs[k] * self.W_c[j][k] for k in range(self.input_size)) + \
sum(h[k] * self.U_c[j][k] for k in range(self.hidden_size)) + self.b_c[j]
g_gate.append(math.tanh(s))
c = [f_gate[j] * c[j] + i_gate[j] * g_gate[j] for j in range(self.hidden_size)]
h = [o_gate[j] * math.tanh(c[j]) for j in range(self.hidden_size)]
y = []
for i in range(self.output_size):
s = sum(h[j] * self.W_y[i][j] for j in range(self.hidden_size)) + self.b_y[i]
y.append(self.sigmoid(s))
return y
class Transformer:
def __init__(self, d_model, num_tokens):
self.d_model = d_model
self.num_tokens = num_tokens
self.W_q = [[random.random() for _ in range(d_model)] for _ in range(d_model)]
self.W_k = [[random.random() for _ in range(d_model)] for _ in range(d_model)]
self.W_v = [[random.random() for _ in range(d_model)] for _ in range(d_model)]
self.W_o = [[random.random() for _ in range(d_model)] for _ in range(d_model)]
def dot_product(self, a, b):
return sum(x * y for x, y in zip(a, b))
def matmul_vector(self, matrix, vector):
return [sum(matrix[i][j] * vector[j] for j in range(len(vector))) for i in range(len(matrix))]
def softmax(self, x):
m = max(x)
exps = [math.exp(i - m) for i in x]
s = sum(exps)
return [j / s for j in exps]
def forward(self, inputs):
queries = [self.matmul_vector(self.W_q, token) for token in inputs]
keys = [self.matmul_vector(self.W_k, token) for token in inputs]
values = [self.matmul_vector(self.W_v, token) for token in inputs]
outputs = []
for i in range(len(inputs)):
scores = []
for j in range(len(inputs)):
score = self.dot_product(queries[i], keys[j]) / math.sqrt(self.d_model)
scores.append(score)
attn = self.softmax(scores)
attn_output = [0] * self.d_model
for j in range(len(inputs)):
for k in range(self.d_model):
attn_output[k] += attn[j] * values[j][k]
out = self.matmul_vector(self.W_o, attn_output)
outputs.append(out)
avg_output = [sum(x[k] for x in outputs) / len(outputs) for k in range(self.d_model)]
proj_weights = [[random.random() for _ in range(self.d_model)] for _ in range(self.num_tokens)]
proj_bias = [random.random() for _ in range(self.num_tokens)]
token_scores = [
sum(avg_output[k] * proj_weights[i][k] for k in range(self.d_model)) + proj_bias[i]
for i in range(self.num_tokens)
]
token_output = [1 / (1 + math.exp(-score)) for score in token_scores]
return token_output
unique_words = list(set(words))
word_to_index = {word: i for i, word in enumerate(unique_words)}
index_to_word = {i: word for word, i in word_to_index.items()}
input_data = [[0] * len(unique_words) for _ in range(len(words) - 2)]
for i in range(len(words) - 2):
input_data[i][word_to_index[words[i]]] = 1
output_data = [[0] * len(unique_words) for _ in range(len(words) - 2)]
for i in range(len(words) - 2):
output_data[i][word_to_index[words[i + 1]]] = 1
input_size = len(unique_words)
hidden_size1 = round(PHI * input_size)
hidden_size2 = round(PHI * hidden_size1)
output_size = len(unique_words)
nn = NeuralNetwork(input_size, hidden_size1, hidden_size2, output_size)
epochs = round(100 * PHI)
for epoch in range(epochs):
for i in range(len(input_data)):
nn.forward(input_data[i])
nn.backward(input_data[i], output_data[i], learning_rate=0.1)
if (epoch + 1) % round(PHI) == 0:
print("Feedforward NN Epoch {}/{}".format(epoch + 1, epochs))
rnn = RecurrentNeuralNetwork(input_size, hidden_size1, output_size)
rnn_output = rnn.forward(input_data[0])
print("Recurrent NN Output:", rnn_output)
kernel_size1 = round(3 * PHI)
kernel_size2 = round(2 * PHI)
cnn = ConvolutionalNeuralNetwork(input_length=round(10 * PHI), kernel_size1=kernel_size1,
kernel_size2=kernel_size2, output_size=output_size)
sample_input = [random.random() for _ in range(round(10 * PHI))]
cnn_output = cnn.forward(sample_input)
print("Convolutional NN Output:", cnn_output)
population_size = round(10 * PHI)
ga = GeneticAlgorithm(population_size, round(PHI * 5))
best_individual, best_fitness = ga.evolve(round(50 * PHI))
print("Genetic Algorithm Best Individual:", best_individual, "Fitness:", best_fitness)
lstm_hidden_size = round(PHI * input_size)
lstm = LSTM(input_size, lstm_hidden_size, output_size)
lstm_output = lstm.forward(input_data[0])
print("LSTM Output:", lstm_output)
transformer_d_model = round(PHI * input_size)
transformer = Transformer(transformer_d_model, output_size)
transformer_input = []
for i in range(len(unique_words)):
vec = [0] * transformer_d_model
if i < transformer_d_model:
vec[i] = 1
transformer_input.append(vec)
transformer_output = transformer.forward(transformer_input)
print("Transformer Output:", transformer_output)
def advanced_text_generation(input_vector):
ff_output = nn.forward(input_vector)
rnn_out = rnn.forward(input_vector)
lstm_out = lstm.forward(input_vector)
transformer_out = transformer.forward([input_vector])
combined = [
(ff_output[i] + rnn_out[i] + lstm_out[i] + transformer_out[i]) / 4
for i in range(len(ff_output))
]
predicted_index = combined.index(max(combined))
predicted_word = index_to_word[predicted_index]
long_text = ""
current_length = round(10 * PHI)
for _ in range(5):
segment = generate_text(current_length)
long_text += segment + " "
current_length = round(current_length * PHI)
return long_text + predicted_word
def chat():
print("FiPhi-NeuralMark ACC Initialized")
base_length = round(5 * PHI)
while True:
user_input = input("\nYou: ")
if user_input.lower() == "exit":
print("Goodbye!")
break
user_input_tokens = user_input.split()
input_vector = [0] * len(unique_words)
for word in user_input_tokens:
if word in word_to_index:
input_vector[word_to_index[word]] = 1
response = advanced_text_generation(input_vector)
print("FiPhi-NeuralMark:", response)
chat()