#!/usr/bin/env python3
# coding=utf-8

#　　　　　 　　┏┓ 　┏┓+ +
#　　　　　　　┏┛┻━━━┛┻┓ + +
#　　　　　　　┃　　　　　　　┃ 　
#　　　　　　　┃　　　━　　　┃ ++ + + +
# 　　 　　　  ████━████ ┃+
#　　　　　　　┃　　　　　　　┃ +
#　　　　　　　┃　　　┻　　　┃
#　　　　　　　┃　　　　　　　┃ + +
#　　　　　　　┗━┓　　　┏━┛
#　　　　　　　　┃　　　┃ + + + +
#　　　　　　　　┃　　　┃
#　　　　　　　　┃　　　┃　　　　Code is far away from bug with the animal protecting
#　　　　　　　　┃　　　┃ + 　　　　神兽保佑,代码无bug
#　　　　　　　　┃　　　┃
#　　　　　　　　┃　　　┃　　+
#　　　　　　　　┃　 　　┗━━━┓ + +
#　　　　　　　　┃ 　　　　　　　┣┓
#　　　　　　　　┃ 　　　　　　　┏┛
#　　　　　　　　┗┓┓┏━┳┓┏┛ + + + +
# 　　　　　　　　┃┫┫　┃┫┫
# 　　　　　　　　┗┻┛　┗┻┛+ + + +



import numpy as np

def computeCost(x, y, theta):
    x_rows, x_cols = x.shape
    theta_rows, theta_cols = theta.shape
    if x_cols != theta_rows:
        print('x_cols:%d, theta_rows:%d' %(x_cols, theta_rows))
        print("Can not dot, please check")
        return None

    tmp = np.dot(x,theta)-y
    sum = (tmp*tmp).sum()
    return sum/2/x_rows


def gradientDescent(x, y, theta, alpha=0.01):
    h = np.dot(x,theta)
    r,c = x.shape
    tmp = (h-y)*x
    tmp = tmp.sum(0)/r*alpha
    tmp = tmp.reshape(c,1)
    theta = theta - tmp
    return theta
