Skip to content

Commit

Permalink
Drhuffman12/add team utils part 5 (#60)
Browse files Browse the repository at this point in the history
* drhuffman12/add_team_utils_part_5 move some tests to spec_bench

* drhuffman12/add_team_utils_part_5 start add more 'always' tests for RnnSimpleManager

* drhuffman12/add_team_utils_part_5 code cleanup

* drhuffman12/add_team_utils_part_5

* drhuffman12/add_team_utils_part_5 revert circleCI config and change github workflow to dual-builds (ubuntu and alpine)

* drhuffman12/add_team_utils_part_5 adjust github ci naming

* drhuffman12/add_team_utils_part_5 try diff CI config
  • Loading branch information
drhuffman12 committed Feb 20, 2021
1 parent 7f5413e commit 376f8eb
Show file tree
Hide file tree
Showing 18 changed files with 373 additions and 107 deletions.
37 changes: 37 additions & 0 deletions .github/workflows/linux_aarch64.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: Crystal CI

on:
push:
branches: [ master ]
# pull_request:
# branches: [ master ]

jobs:
build:

runs-on: [linux, ARM64]

container:
image: crystallang/crystal:nightly-alpine

steps:
- uses: actions/checkout@v2

- name: Show Crystal version
run: crystal -v

- name: Install dependencies
# run: shards install && shards update
run: shards install --ignore-crystal-version && shards update --ignore-crystal-version

- name: Show repo version
run: scripts/version_info

- name: Run static code analysis
run: bin/ameba --no-color
- name: Run tests
run: scripts/test_always

# run: crystal spec
- name: Run tests (w/ junit format)
run: scripts/test_always_junit_format
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ name: Crystal CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
# pull_request:
# branches: [ master ]

jobs:
build:
Expand Down
1 change: 0 additions & 1 deletion spec/ai4cr/breed/manager_spec.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../../spec_helper"
require "./../../spectator_helper"

class MyBreed
Expand Down
1 change: 0 additions & 1 deletion spec/ai4cr/error_stats_spec.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../spec_helper"
require "./../spectator_helper"

Spectator.describe Ai4cr::ErrorStats do
Expand Down
1 change: 0 additions & 1 deletion spec/ai4cr/neural_network/cmn/mini_net_manager_spec.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../../../spec_helper"
require "./../../../spectator_helper"

Spectator.describe Ai4cr::NeuralNetwork::Cmn::MiniNetManager do
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../../../spec_helper"
require "./../../../spectator_helper"

Spectator.describe "from_json" do
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../../../spec_helper"
require "./../../../spectator_helper"

Spectator.describe Ai4cr::NeuralNetwork::Cmn::MiniNetManager do
Expand Down
1 change: 0 additions & 1 deletion spec/ai4cr/neural_network/from_json/mini_net_spec.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../../../spec_helper"
require "./../../../spectator_helper"

Spectator.describe "from_json" do
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../../../spec_helper"
require "./../../../spectator_helper"

Spectator.describe Ai4cr::NeuralNetwork::Rnn::RnnSimpleManager do
Expand Down
1 change: 0 additions & 1 deletion spec/ai4cr/neural_network/from_json/rnn_simple_spec.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../../../spec_helper"
require "./../../../spectator_helper"

Spectator.describe Ai4cr::NeuralNetwork::Cmn::RnnSimpleConcerns::TrainAndAdjust do
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../../../../spec_helper"
require "./../../../../spectator_helper"

Spectator.describe Ai4cr::NeuralNetwork::Rnn::RnnSimpleConcerns::CalcGuess do
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../../../../spec_helper"
require "./../../../../spectator_helper"

Spectator.describe Ai4cr::NeuralNetwork::Rnn::RnnSimpleConcerns::DataUtils do
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../../../../spec_helper"
require "./../../../../spectator_helper"

Spectator.describe Ai4cr::NeuralNetwork::Rnn::RnnSimpleConcerns::PropsAndInits do
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../../../../spec_helper"
require "./../../../../spectator_helper"

Spectator.describe Ai4cr::NeuralNetwork::Rnn::RnnSimpleConcerns::TrainAndAdjust do
Expand Down
194 changes: 113 additions & 81 deletions spec/ai4cr/neural_network/rnn/rnn_simple_manager_spec.cr
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
require "./../../../spec_helper"
require "./../../../spectator_helper"

Spectator.describe Ai4cr::NeuralNetwork::Rnn::RnnSimpleManager do
let(my_breed_manager) { Ai4cr::NeuralNetwork::Rnn::RnnSimpleManager.new }
let(delta_child_1) { Ai4cr::Data::Utils.rand_neg_half_to_pos_one_and_half_no_zero_no_one }
let(delta_child_2) { Ai4cr::Data::Utils.rand_neg_half_to_pos_one_and_half_no_zero_no_one }

let(ancestor_adam_value) { 0.1 }
let(ancestor_eve_value) { 0.9 }
let(expected_child_1_value) { ancestor_adam_value + delta_child_1 * (ancestor_eve_value - ancestor_adam_value) }

let(params) { my_breed_manager.gen_params }
let(config_default_randomized) {
Ai4cr::NeuralNetwork::Rnn::RnnSimple.new.config
# Ai4cr::NeuralNetwork::Rnn::RnnSimple.new.config
params
}

let(config_adam) {
Expand Down Expand Up @@ -192,13 +192,6 @@ Spectator.describe Ai4cr::NeuralNetwork::Rnn::RnnSimpleManager do
end

context "children have expected values for" do
# let(child_1) {
# # cain
# child = my_breed_manager.breed(ancestor_adam, ancestor_eve, delta: delta_child_1)
# child.name = "Cain, child of #{ancestor_adam.name} and #{ancestor_eve.name}"
# child
# }

let(ancestor_adam_json) { JSON.parse(ancestor_adam.to_json) }
let(ancestor_eve_json) { JSON.parse(ancestor_eve.to_json) }
let(child_1_json) { JSON.parse(child_1.to_json) }
Expand Down Expand Up @@ -334,92 +327,131 @@ Spectator.describe Ai4cr::NeuralNetwork::Rnn::RnnSimpleManager do
end
end

describe "#build_team" do
context "when using all defaults" do
it "creates specified quantity of members" do
qty_new_members = 4
params = Ai4cr::NeuralNetwork::Rnn::RnnSimple.new.config
next_gen_members = my_breed_manager.build_team(qty_new_members, **params)
expect(next_gen_members.size).to eq(qty_new_members)
end
describe "#gen_params" do
let(param_keys) { params.keys.to_a }
let(expected_keys) {
[
:name, :history_size, :io_offset, :time_col_qty,
:input_size, :output_size, :hidden_layer_qty, :hidden_size_given,
:learning_style, :bias_disabled, :bias_default, :learning_rate,
:momentum, :deriv_scale,
]
}
it "which include expected keys" do
expect(param_keys).to eq(expected_keys)
end
end

describe "#train_team" do
pending "successive generations score better (i.e.: lower errors)" do
# TODO: (a) move to 'spec_bench' and (b) replace here with more 'always' tests
max_members = 10
qty_new_members = max_members
describe "#build_team" do
context "with defaults" do
let(team_members) { my_breed_manager.build_team }

params = Ai4cr::NeuralNetwork::Rnn::RnnSimple.new.config
it "builds a team of expected size" do
expect(team_members.size).to eq(10)
end

first_gen_members = my_breed_manager.build_team(qty_new_members, **params)
second_gen_members = my_breed_manager.train_team(inputs, outputs, first_gen_members, max_members)
third_gen_members = my_breed_manager.train_team(inputs, outputs, second_gen_members, max_members)
it "builds a team of expected class" do
expect(team_members.class).to eq(Array(Ai4cr::NeuralNetwork::Rnn::RnnSimple))
end

first_gen_members_scored = first_gen_members.map { |member| member.error_stats.score }.sum / qty_new_members
first_gen_members_stats = first_gen_members.map { |member| "#{member.birth_id} => #{member.error_stats.plot_error_distance_history} @ #{member.error_stats.score}" }
context "creates members with expected values for" do
it ":name" do
key = :name
key_string = key.to_s
team_members.each do |member|
member_json = JSON.parse(member.to_json)
expect(member_json[key_string]).to eq(params[key_string])
end
# member = team_members.first
# member_json = JSON.parse(member.to_json)
# expect(member_json[key_string]).to eq(params[key_string])
end
end

second_gen_members_scored = second_gen_members.map { |member| member.error_stats.score }.sum / qty_new_members
second_gen_members_stats = second_gen_members.map { |member| "#{member.birth_id} => #{member.error_stats.plot_error_distance_history} @ #{member.error_stats.score}" }
# context "creates members of specified params for key" do
# let(next_gen_members) { my_breed_manager.build_team }
# it "creates members of specified params" do
# qty_new_members = 4
# params = Ai4cr::NeuralNetwork::Rnn::RnnSimple.new.config
# next_gen_members = my_breed_manager.build_team(qty_new_members, **params)

# puts
# puts "params.class: #{params.class}"
# puts
# puts "params.keys: #{params.keys}"
# puts
# puts "JSON.parse(next_gen_members.first.to_json)[:name.to_s]: #{JSON.parse(next_gen_members.first.to_json)[:name.to_s]}"
# puts

# next_gen_members.each do |member|
# member_json = JSON.parse(next_gen_members.first.to_json)
# (params.keys.to_a - [:history_size, :learning_style]).each do |key|
# key_string = key.to_s
# params_value = params[key]

# # expect([key_string, member_json[key_string]]).to eq([key_string, params_value])
# # assert_approximate_equality_of_nested_list([key_string, member_json[key_string]], [key_string, params_value])
# end
# end

# end
# end
end

third_gen_members_scored = third_gen_members.map { |member| member.error_stats.score }.sum / qty_new_members
third_gen_members_stats = third_gen_members.map { |member| "#{member.birth_id} => #{member.error_stats.plot_error_distance_history} @ #{member.error_stats.score}" }
context "when given qty_new_members' and using defaults params" do
it "creates specified quantity of members" do
qty_new_members = 4
next_gen_members = my_breed_manager.build_team(qty_new_members)
expect(next_gen_members.size).to eq(qty_new_members)
end

puts
puts "#train_team:"
puts
puts "first_gen_members_scored: #{first_gen_members_scored}"
first_gen_members_stats.each { |m| puts m }
it "creates members of specified class" do
qty_new_members = 4
next_gen_members = my_breed_manager.build_team(qty_new_members)
member_classes = next_gen_members.map { |member| member.class.name }.sort.uniq
expect(member_classes.size).to eq(1)
expect(member_classes.first).to eq(Ai4cr::NeuralNetwork::Rnn::RnnSimple.name)
end
end

puts
puts "second_gen_members_scored: #{second_gen_members_scored}"
second_gen_members_stats.each { |m| puts m }
expect(second_gen_members_scored).to be < first_gen_members_scored
context "when given qty_new_members' and params" do
it "creates specified quantity of members" do
qty_new_members = 4
params = Ai4cr::NeuralNetwork::Rnn::RnnSimple.new.config
next_gen_members = my_breed_manager.build_team(qty_new_members, **params)
expect(next_gen_members.size).to eq(qty_new_members)
end

puts
puts "third_gen_members_scored: #{third_gen_members_scored}"
third_gen_members_stats.each { |m| puts m }
expect(third_gen_members_scored).to be < second_gen_members_scored
it "creates members of specified class" do
qty_new_members = 4
params = Ai4cr::NeuralNetwork::Rnn::RnnSimple.new.config
next_gen_members = my_breed_manager.build_team(qty_new_members, **params)
member_classes = next_gen_members.map { |member| member.class.name }.sort.uniq
expect(member_classes.size).to eq(1)
expect(member_classes.first).to eq(Ai4cr::NeuralNetwork::Rnn::RnnSimple.name)
end
end
end

describe "#train_team_using_sequence" do
pending "successive generations score better (i.e.: lower errors)" do
# TODO: (a) move to 'spec_bench' and (b) replace here with more 'always' tests
max_members = 10
qty_new_members = max_members

params = Ai4cr::NeuralNetwork::Rnn::RnnSimple.new.config

first_gen_members = my_breed_manager.build_team(qty_new_members, **params)
second_gen_members = my_breed_manager.train_team_using_sequence(inputs_sequence, outputs_sequence, first_gen_members, max_members)
third_gen_members = my_breed_manager.train_team_using_sequence(inputs_sequence, outputs_sequence, second_gen_members, max_members)

first_gen_members_scored = first_gen_members.map { |member| member.error_stats.score }.sum / qty_new_members
first_gen_members_stats = first_gen_members.map { |member| "#{member.birth_id} => #{member.error_stats.plot_error_distance_history} @ #{member.error_stats.score}" }

second_gen_members_scored = second_gen_members.map { |member| member.error_stats.score }.sum / qty_new_members
second_gen_members_stats = second_gen_members.map { |member| "#{member.birth_id} => #{member.error_stats.plot_error_distance_history} @ #{member.error_stats.score}" }

third_gen_members_scored = third_gen_members.map { |member| member.error_stats.score }.sum / qty_new_members
third_gen_members_stats = third_gen_members.map { |member| "#{member.birth_id} => #{member.error_stats.plot_error_distance_history} @ #{member.error_stats.score}" }

puts
puts "#train_team_using_sequence:"
puts
puts "first_gen_members_scored: #{first_gen_members_scored}"
first_gen_members_stats.each { |m| puts m }
describe "#train_team" do
context "with defaults" do
# let(qty_new_members) { 3 }
let(team_members) { my_breed_manager.build_team } # (qty_new_members) }

# let(inputs) { 3 }
# let(outputs) { 3 }
# let(max_members) { 3 }

# it "" do
# expect(team_members.size).
# next_gen_members = my_breed_manager.train_team(inputs, outputs, team_members) #, max_members)
# end
end
end

puts
puts "second_gen_members_scored: #{second_gen_members_scored}"
second_gen_members_stats.each { |m| puts m }
expect(second_gen_members_scored).to be < first_gen_members_scored
describe "#train_team_using_sequence" do
end

puts
puts "third_gen_members_scored: #{third_gen_members_scored}"
third_gen_members_stats.each { |m| puts m }
expect(third_gen_members_scored).to be < second_gen_members_scored
end
describe "#cross_breed" do
end
end
1 change: 0 additions & 1 deletion spec/ai4cr/team_spec.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "./../spec_helper"
require "./../spectator_helper"

Spectator.describe Ai4cr::Team do
Expand Down

0 comments on commit 376f8eb

Please sign in to comment.