start version 0.0.6

This commit is contained in:
2023-06-20 10:15:47 +07:00
parent 57efefc8e3
commit 90446210ac
63 changed files with 4404 additions and 26 deletions

View File

@@ -0,0 +1,153 @@
module DB_services
""" version 0.2
"""
using DataStructures: count
export send_to_DB, data_prep_for_DB
using DataStructures
using JSON3
using Redis
using Random
using UUIDs
include("Utils.jl")
using .Utils
"""
Dummy iron_pen_ai for raw_data_db_service testing
"""
#------------------------------------------------------------------------------------------------100
""" Prepare model data for sending to raw_data_db_service by flattening all hierarchy
data structure inside model_data into 1-dept JSON3.
This function output is flattened JSON3 data
*** all parameter name that is going to Cassandra must not contain a capital letter ***
"""
function data_prep_for_DB(model_name::String, experiment_number::Int, episode_number::Int,
time_stamp::Int, model_data::OrderedDict)::Array{OrderedDict, 1}
payload_template = OrderedDict{Any, Any}(
:model_name => model_name,
:knowledgeFn_name => "none",
:experiment_number => experiment_number,
:episode_number => episode_number,
)
payloads = []
for (k, v) in model_data[:m][:knowledgeFn] # loop over each knowledgeFn
payload = deepcopy(payload_template)
payload[:knowledgeFn_name] = v[:knowledgefn_name]
payload[:neurons_list] = []
for (k1, v1) in v
if k1 == :neurons_array || k1 == :output_neurons_array
for (k2, v2) in v1 # loop over each neuron
if k2 != :type # add the following additonal data into neuron's ODict data (already have its parameters in there)
neuron = OrderedDict(v2) # v2 is still in JSON3 format but
# to be able to add new value to
# it, it needs to be in
# OrderedDict format
# # add corresponding knowledgeFn to neuron OrderedDict
# neuron[:knowledgefn_name] = v[:knowledgefn_name]
# add corresponding experiment_number to neuron OrderedDict
neuron[:experiment_number] = experiment_number
# add corresponding episode_number to neuron OrderedDict
neuron[:episode_number] = episode_number
# # add corresponding tick_number to neuron OrderedDict
# neuron[:tick_number] = tick_number
""" add neuron name of itself to neuron OrderedDict
since neurons in neurons_array and output_neurons_array has the
same name (because its name derived from its position in the
array it lives in). In order to store them in the same
OrderedDict, I need to change their name so I prefix their name
with their array name
"""
neuron[:neuron_name] = Symbol(string(k1) * "_" * string(k2))
neuron[:model_error] = model_data[:m][:model_error]
neuron[:knowledgefn_error] = model_data[:m][:knowledgeFn][k][:knowledgeFn_error]
neuron[:model_name] = model_name
# use as identifier durin debug
# neuron[:random] = Random.rand(1:100)
push!(payload[:neurons_list], neuron)
end
end
end
end
push!(payloads, payload)
end
return payloads
end
function send_to_DB(model_name::String, experiment_number::Int, episode_number::Int,
tick_number::Int, model_json_string::String, redis_server_ip::String,
pub_channel::String, sub_channel::String)
model_ordereddict = OrderedDict(JSON3.read(model_json_string))
payloads = data_prep_for_DB(model_name, experiment_number, episode_number, tick_number,
model_ordereddict)
for payload in payloads
# ask raw data service whether it is ready
# println("checking raw_data_db_service")
ask = Dict(:sender => "ironpen_ai",
:topic => "whois", # [uuid1(), "whois"] to get name of the receiver
:topic_id => uuid1(),
:responding_to => nothing, # receiver fills in the message uuid it is responding to
:communication_channel => sub_channel, # a channel that sender wants receiver to send message to or "none" to get message at receiver's default respond channel
:instruction => nothing,
:payload => nothing,
:isreturn => true)
incoming_message = Utils.service_query(redis_server_ip, pub_channel, sub_channel, ask)
# println("raw_data_db_service ok")
if UUID(incoming_message[:responding_to]) == ask[:topic_id]
message = Dict(:sender => "ironpen_ai",
:topic => "process", # [uuid1(), "whois"] to get name of the receiver
:topic_id => uuid1(),
:responding_to => nothing, # receiver fills in the message uuid it is responding to
:communication_channel => sub_channel, # a channel that sender wants receiver to send message to or "none" to get message at receiver's default respond channel
:instruction => "insert",
:payload => payload,
:isreturn => false)
result = Utils.service_query(redis_server_ip, pub_channel, sub_channel, message)
# println("published")
else
error("raw_data_db_service not respond")
end
end
end
end # module end