# %% [markdown]
# # Neuron with 3 inputs

# %%
inputs = [1, 2, 3]
weights = [0.2, 0.8, -0.5]
bias = 2

output = (inputs[0]*weights[0] + inputs[1]*weights[1] + inputs[2]*weights[2] + bias)

print(f"Output: {output}")

# %% [markdown]
# # Neuron with 4 inputs

# %%
inputs = [1.0, 2.0, 3.0, 2.5]
weights = [0.2, 0.8, -0.5, 1.0]
bias = 2

output = (inputs[0]*weights[0] + inputs[1]*weights[1] + inputs[2]*weights[2] + inputs[3]*weights[3] + bias)

print(output)

# %% [markdown]
# # Layer of 3 neurons with 4 inputs

# %%
num_neurons = 3
num_inputs = 4
inputs = [1.0, 2.0, 3.0, 2.5]
weights = [[0.2, 0.8, -0.5, 1.0],
           [0.5, -0.91, 0.26, -0.5],
           [-0.26, -0.27, 0.17, 0.87]]
biases = [2, 3, 0.5]

outputs = []
for i in range(num_neurons):
    output = 0
    for j in range(num_inputs):
        output += inputs[j]*weights[i][j]
    output += biases[i]
    outputs.append(output)

print(outputs)

# %% [markdown]
# # Layer of 3 neurons with 4 inputs

# %%
num_neurons = 3
num_inputs = 4
inputs = [1.0, 2.0, 3.0, 2.5]
weights = [[0.2, 0.8, -0.5, 1.0],
           [0.5, -0.91, 0.26, -0.5],
           [-0.26, -0.27, 0.17, 0.87]]
biases = [2, 3, 0.5]

outputs = []
for neuron_weights, neuron_bias in zip(weights, biases):
    neuron_output = 0
    for input, weight in zip(inputs, neuron_weights):
        neuron_output += input*weight
    neuron_output += neuron_bias
    outputs.append(neuron_output)

print(outputs)

# %% [markdown]
# # Single Neuron using Numpy

# %%
import numpy as np

inputs = [1.0, 2.0, 3.0, 2.5]
weights = [0.2, 0.8, -0.5, 1.0]
bias = 2

output = np.dot(inputs, weights) + bias
print(output)


