# data collection that converts into Social Transmedia

import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.optim as optim

x = Variable(torch.Tensor([[1],[2],[3],[4]]))
y = Variable(torch.Tensor([[2],[4],[6],[8]]))

class SocialTransmedia(nn.Module):
    def __init__(self, input_size, output_size):
            super(SocialTransmedia, self).__init__()
            self.linear = nn.Linear(input_size, output_size)
            
    def forward(self, x):
        y_predict = self.linear(x)
        return y_predict
            
            
model = SocialTransmedia(1,1)
criteria = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), 0.01)

for epoch in range(500):
    y_predict = model(x)
    loss = criteria(y_predict, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    print(epoch, float(loss.data[0]))
    
test = Variable(torch.Tensor([[20]]))
z = model.forward(test)
print(float(z.data[0]))

# 39.88399887084961

# Logistic Regression

import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as f

x = Variable(torch.Tensor([[25],[35],[45],[15]]))
y = Variable(torch.Tensor([[0],[1],[1],[0]]))

class SocialTransmedia(nn.Module):
    def __init__(self, input_size, output_size):
            super(SocialTransmedia, self).__init__()
            self.linear = nn.Linear(input_size, output_size)
            
    def forward(self, x):
        y_predict = f.sigmoid(self.linear(x))
        return y_predict
            
            
model = SocialTransmedia(1,1)
criteria = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), 0.01)

for epoch in range(500):
    y_predict = model(x)
    loss = criteria(y_predict, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    print(epoch, float(loss.data[0]))
    
test = Variable(torch.Tensor([[20]]))
z = model.forward(test)
print(float(z.data[0]))