def generate_and_save_all_datasets(): for operator in config.operators_list(): for operand_digits in config.operand_digits_list(): op_dataset, carry_datasets = generate_datasets( operand_digits, operator) save_op_dataset(op_dataset, operand_digits, operator) save_carry_datasets(carry_datasets, operand_digits, operator) for operand_digits in config.operand_digits_list(): random_datasets = generate_random_datasets(operand_digits) save_random_datasets(random_datasets, operand_digits)
def test_import_random_sampled_carry_datasets(n_samples=10): ''' "To test the function `import_random_sampled_carry_datasets`" ''' is_all_correct = True for operand_digits in config.operand_digits_list(): for operator in config.operators_list(): carry_datasets = import_random_sampled_carry_datasets( operand_digits, operator, n_samples) for n_carries in carry_datasets.keys(): n_operations = carry_datasets[n_carries]['input'].shape[0] for i_operation in range(n_operations): operand1 = carry_datasets[n_carries]['input'][ i_operation, :operand_digits] operand2 = carry_datasets[n_carries]['input'][ i_operation, operand_digits:] result = carry_datasets[n_carries]['output'][ i_operation, :] result_by_computing = operate_two_numbers( operand1, operand2, operator)[0] # Get the first element is_equal = np.array_equal(result, result_by_computing) if not is_equal: print(operand1) print(operand2) print(result) print(result_by_computing) print('================') is_all_correct = is_all_correct and is_equal return is_all_correct
def test_func_add_two_numbers(): is_all_correct = True for operand_digits in config.operand_digits_list(): # varying part result_digits = get_result_digits(operand_digits, 'add') for dec_op1 in range(2**operand_digits): for dec_op2 in range(2**operand_digits): # varying part bin_result = get_str_bin(dec_op1 + dec_op2) np_bin_result = get_np_bin(bin_result, result_digits) np_bin_op1 = get_np_bin(get_str_bin(dec_op1), operand_digits) np_bin_op2 = get_np_bin(get_str_bin(dec_op2), operand_digits) np_bin_result_algo, _ = add_two_numbers(np_bin_op1, np_bin_op2) is_equal = np.array_equal(np_bin_result, np_bin_result_algo) is_all_correct = is_all_correct and is_equal return is_all_correct
def test_multiply_symmetric_carries(): ''' Purpose : To test whether the number of carries while multipication is same for a * b and b * a. Result : The number of carries is always same for a * b and b * a. ''' is_all_symmetric = True for operand_digits in config.operand_digits_list(): for int_dec_operand1 in range(2**operand_digits): for int_dec_operand2 in range(2**operand_digits): operand1 = get_np_bin(get_str_bin(int_dec_operand1), operand_digits) operand2 = get_np_bin(get_str_bin(int_dec_operand2), operand_digits) result1, _ = multiply_two_numbers(operand1, operand2) result2, _ = multiply_two_numbers(operand2, operand1) is_equal = np.array_equal(result1, result2) is_all_symmetric = is_all_symmetric and is_equal return is_all_symmetric
def plot_carry_dataset_statistics(mode='save', file_format='svg'): df_carry_ds_stat = pd.read_csv(get_carry_ds_stat_path()) df_carry_ds_stat = df_carry_ds_stat[[ 'operator', 'operand digits', 'carries', 'carry percentage' ]] for operand_digits in config.operand_digits_list(): plt.title( 'Percentage of operations by required carries ({}-digit operand)'. format(operand_digits)) plt.xlabel('Carries') plt.ylabel('Percentage (%)') plt.grid(axis='y') plt.yticks(np.arange(0, 101, step=10)) plt.ylim(0, 101) for operator in config.operators_list(): if operator == 'modulo': break if operator == 'divide': operator_label = 'divide/modulo' else: operator_label = operator df = df_carry_ds_stat.loc[ (df_carry_ds_stat['operator'] == operator) & (df_carry_ds_stat['operand digits'] == operand_digits)] df = df[['carries', 'carry percentage']] plt.plot(df['carries'], df['carry percentage'], ':o', label=operator_label) #plt.bar(df['carries'], df['carry percentage'], label=operator) plt.legend() if mode == 'show': plt.show() if mode == 'save': create_dir(config.dir_plot_fig()) plot_fig_path = '{}/carry_dataset_statistics_{}-digit_operand.{}'.format( config.dir_plot_fig(), operand_digits, file_format) plt.savefig(plot_fig_path) print('{} saved!'.format(plot_fig_path)) plt.clf()
def test_func_multiply_two_numbers(): is_all_correct = True for operand_digits in config.operand_digits_list(): # varying part result_digits = get_result_digits(operand_digits, 'multiply') for int_dec_operand1 in range(2**operand_digits): for int_dec_operand2 in range(2**operand_digits): # varying part bin_result = get_str_bin(int_dec_operand1 * int_dec_operand2) np_result = get_np_bin(bin_result, result_digits) np_operand1 = get_np_bin(get_str_bin(int_dec_operand1), operand_digits) np_operand2 = get_np_bin(get_str_bin(int_dec_operand2), operand_digits) np_bin_result_algo, _ = multiply_two_numbers( np_operand1, np_operand2) is_equal = np.array_equal(np_result, np_bin_result_algo) is_all_correct = is_all_correct and is_equal return is_all_correct
def test_func_subtract_two_numbers(): is_all_correct = True for operand_digits in config.operand_digits_list(): # varying part result_digits = get_result_digits(operand_digits, 'subtract') for int_dec_operand1 in range(2**operand_digits): for int_dec_operand2 in range(2**operand_digits): if int_dec_operand1 >= int_dec_operand2: # Only these cases are dealth with. # varying part bin_result = get_str_bin(int_dec_operand1 - int_dec_operand2) np_result = get_np_bin(bin_result, result_digits) np_operand1 = get_np_bin(get_str_bin(int_dec_operand1), operand_digits) np_operand2 = get_np_bin(get_str_bin(int_dec_operand2), operand_digits) np_bin_result_algo, _ = subtract_two_numbers( np_operand1, np_operand2) is_equal = np.array_equal(np_result, np_bin_result_algo) is_all_correct = is_all_correct and is_equal return is_all_correct
def write_carry_dataset_statistics(): carry_dataset_info_list = list() csv_file_path = get_carry_ds_stat_path() create_dir(config.dir_data()) for operator in config.operators_list(): for operand_digits in config.operand_digits_list(): carry_datasets = generate_datasets(operand_digits, operator) carry_dataset_info_list = carry_dataset_info_list + get_carry_dataset_info_list( carry_datasets, operator) with open(csv_file_path, mode='w') as csv_file: fieldnames = [ 'operator', 'operand digits', 'input dimension', 'output dimension', 'total operations', 'carries', 'carry operations', 'carry percentage' ] writer = csv.DictWriter(csv_file, fieldnames=fieldnames) writer.writeheader() for carry_dataset_info in carry_dataset_info_list: writer.writerow(carry_dataset_info) print('{} saved!'.format(csv_file_path))