def verifyFirstIterationProbabilities():
    theta = np.zeros([10, trainX.shape[1]])

    probabilities = computeProbabilities(trainX, theta, tempParameter)
    probabilities_correct = np.ones((10, 10), dtype=np.float) * 0.1
    if np.all(np.absolute(probabilities - probabilities_correct) < 1.0e-6):
        print("Verifying probabilities during first iteration: Passed")
    else:
        print("Verifying probabilities during first iteration: Failed")
def verifySecondIterationProbabilities():
    theta = np.zeros([10, trainX.shape[1]])

    for i in range(2):
        probabilities = computeProbabilities(trainX, theta, tempParameter)
        theta = runGradientDescentIteration(trainX, trainY, theta, alpha,
                                            lambdaFactor, tempParameter)

    probabilities_correct = np.array(
        [[
            0.09597698, 0.4196854, 0.05667909, 0.06235487, 0.06899079,
            0.06916521, 0.0349496, 0.06532456, 0.05395287, 0.0534354
        ],
         [
             0.1983818, 0.10531464, 0.06639631, 0.45786242, 0.28722984,
             0.17173531, 0.66822544, 0.17628658, 0.49547944, 0.12812545
         ],
         [
             0.06894131, 0.0729084, 0.07108203, 0.07492149, 0.09201906,
             0.32024728, 0.04201663, 0.06632575, 0.06420374, 0.07989414
         ],
         [
             0.15999806, 0.11905036, 0.10471412, 0.10113209, 0.09236406,
             0.11466912, 0.0524019, 0.40685285, 0.06768243, 0.08783947
         ],
         [
             0.08006051, 0.07574158, 0.48790648, 0.07751524, 0.10680567,
             0.13473093, 0.04778263, 0.12621854, 0.06412731, 0.46603252
         ],
         [
             0.29379288, 0.09461314, 0.05543612, 0.06703539, 0.05533667,
             0.06447243, 0.04871483, 0.08654557, 0.06685891, 0.0569282
         ],
         [
             0.01879811, 0.01853099, 0.03324019, 0.03119805, 0.02239253,
             0.01757959, 0.01861633, 0.01016821, 0.03562178, 0.02229219
         ],
         [
             0.01879811, 0.01853099, 0.03324019, 0.03119805, 0.02239253,
             0.01757959, 0.01861633, 0.01016821, 0.03562178, 0.02229219
         ],
         [
             0.01879811, 0.01853099, 0.03324019, 0.03119805, 0.02239253,
             0.01757959, 0.01861633, 0.01016821, 0.03562178, 0.02229219
         ],
         [
             0.04645412, 0.0570935, 0.05806529, 0.06558436, 0.23007632,
             0.07224095, 0.05006, 0.04194153, 0.08082997, 0.06086825
         ]])

    if np.all(np.absolute(probabilities - probabilities_correct) < 1.0e-6):
        print("Verifying probabilities during second iteration: Passed")
    else:
        print("Verifying probabilities during second iteration: Failed")
def verifyInputOutputTypesSoftmax():
    trainX, trainY, testX, testY = getMNISTData()
    trainX = augmentFeatureVector(trainX[0:10])
    trainY = trainY[0:10]
    alpha = 0.3
    lambdaFactor = 1.0e-4
    theta = np.zeros([10, trainX.shape[1]])
    tempParameter = 1

    # check computeCostFunction
    cost = computeCostFunction(trainX, trainY, theta, lambdaFactor,
                               tempParameter)
    print('PASSED: computeCostFunction appears to handle correct input type.')
    if isinstance(cost, float):
        print('PASSED: computeCostFunction appears to return the right type.')
    else:
        print(
            'FAILED: computeCostFunction appears to return the wrong type. Expected {0} but got {1}'
            .format(float, type(cost)))

    # check computeProbabilities
    probabilities = computeProbabilities(trainX, theta, tempParameter)
    print('PASSED: computeProbabilities appears to handle correct input type.')
    if isinstance(probabilities, np.ndarray):
        if probabilities.shape == (10, 10):
            print(
                'PASSED: computeProbabilities return value appears to return a numpy array of the right shape.'
            )
        else:
            print('FAILED: computeProbabilities return value appears to return a numpy array but with the wrong size. ' + \
                    'Expected a shape of {0} but got {1}.'.format((10,10), probabilities.shape))
    else:
        print('FAILED: computeProbabilities appears to be the wrong type. ' + \
                'Expected {0} but got {1}.'.format(type(np.array(range(4))), type(probabilities)))

    # check gradient descent
    theta = runGradientDescentIteration(trainX, trainY, theta, alpha,
                                        lambdaFactor, tempParameter)
    print(
        'PASSED: runGradientDescentIteration appears to handle correct input type.'
    )
    if isinstance(theta, np.ndarray):
        if theta.shape == (10, 785):
            print(
                'PASSED: runGradientDescentIteration return value appears to return a numpy array of the right shape.'
            )
        else:
            print('FAILED: runGradientDescentIteration return value appears to return a numpy array but with the wrong size. ' + \
                    'Expected {0} but got {1}.'.format((10, 785), theta.shape))
    else:
        print('FAILED: runGradientDescentIteration appears to return the wrong type. ' + \
                'Expected {0} but got {1}'.format(type(np.array(range(4))), type(theta)))