Skip to content

Commit

Permalink
Extract KnowledgeNetwork interfaces
Browse files Browse the repository at this point in the history
  • Loading branch information
lmorisse committed Aug 26, 2020
1 parent 96c1baf commit ac18f98
Show file tree
Hide file tree
Showing 61 changed files with 395 additions and 342 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
using Symu.Common.Interfaces.Entity;
using Symu.Common.Math.ProbabilityDistributions;
using Symu.Messaging.Templates;
using Symu.Repository.Entity;
using Symu.Repository.Networks;
using Symu.Repository.Networks.Beliefs;
using Symu.Repository.Networks.Knowledges;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using Symu.Common;
using Symu.Common.Interfaces.Entity;
using Symu.Common.Math.ProbabilityDistributions;
using Symu.Repository.Entity;
using Symu.Repository.Networks.Knowledges;
using static Symu.Common.Constants;

Expand Down Expand Up @@ -64,7 +65,7 @@ public float PercentageForgetting
/// <returns></returns>
public float GetKnowledgeSum()
{
return Expertise.List.Sum(l => l.GetKnowledgeSum());
return Expertise.GetAgentKnowledges<AgentKnowledge>().Sum(l => l.GetKnowledgeSum());
}

public ForgettingModel(ModelEntity entity, bool knowledgeModelOn, CognitiveArchitecture cognitive,
Expand Down Expand Up @@ -213,7 +214,7 @@ public void InitializeForgettingProcess()
}

ForgettingExpertise.Clear();
foreach (var knowledge in Expertise.List)
foreach (var knowledge in Expertise.GetAgentKnowledges<AgentKnowledge>())
{
ForgettingExpertise.Add(InitializeForgettingKnowledge(knowledge));
}
Expand All @@ -232,7 +233,7 @@ public void FinalizeForgettingProcess(ushort step)
return;
}

foreach (var forget in ForgettingExpertise.List)
foreach (var forget in ForgettingExpertise.GetAgentKnowledges<AgentKnowledge>())
{
FinalizeForgettingKnowledge(forget, step);
}
Expand All @@ -246,7 +247,7 @@ public void FinalizeForgettingKnowledge(AgentKnowledge forget, ushort step)
}

var forgetBits = forget.CloneBits();
var agentKnowledge = Expertise.GetKnowledge(forget.KnowledgeId);
var agentKnowledge = Expertise.GetAgentKnowledge<AgentKnowledge>(forget.KnowledgeId);
switch (InternalCharacteristics.ForgettingSelectingMode)
{
case ForgettingSelectingMode.Random:
Expand Down Expand Up @@ -372,13 +373,13 @@ public float[] InitializeForgettingKnowledgeRandom(AgentKnowledge agentKnowledge
/// </summary>
public void ForgettingProcess(float forgettingRate, ushort step)
{
Expertise.List.ForEach(x => ForgettingProcess(x, forgettingRate, step));
Expertise.GetAgentKnowledges<AgentKnowledge>().ToList().ForEach(x => ForgettingProcess(x, forgettingRate, step));
}

/// <summary>
/// Forget knowledgeBits based on knowledgeBits.LastTouched and timeToLive value
/// </summary>
public void ForgettingProcess(AgentKnowledge agentKnowledge, float forgettingRate, ushort step)
public static void ForgettingProcess(AgentKnowledge agentKnowledge, float forgettingRate, ushort step)
{
if (agentKnowledge == null)
{
Expand All @@ -401,7 +402,7 @@ public void UpdateForgettingProcess(IId knowledgeId, byte[] workingBits)
throw new ArgumentNullException(nameof(workingBits));
}

var forgettingKnowledge = ForgettingExpertise.GetKnowledge(knowledgeId);
var forgettingKnowledge = ForgettingExpertise.GetAgentKnowledge<AgentKnowledge>(knowledgeId);
if (forgettingKnowledge == null)
{
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using Symu.Common.Interfaces.Agent;
using Symu.Common.Interfaces.Entity;
using Symu.Common.Math.ProbabilityDistributions;
using Symu.Repository.Entity;
using Symu.Repository.Networks;
using Symu.Repository.Networks.Beliefs;
using Symu.Repository.Networks.Influences;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
using Symu.Common.Interfaces.Entity;
using Symu.Common.Math.ProbabilityDistributions;
using Symu.Messaging.Templates;
using Symu.Repository.Entity;
using Symu.Repository.Networks;
using Symu.Repository.Networks.Knowledges;
using static Symu.Common.Constants;
Expand Down Expand Up @@ -100,7 +101,7 @@ public class KnowledgeModel
/// <returns></returns>
public float GetKnowledgeSum()
{
return Expertise.List.Sum(l => l.GetKnowledgeSum());
return Expertise.GetAgentKnowledges<AgentKnowledge>().Sum(l => l.GetKnowledgeSum());
}

/// <summary>
Expand All @@ -109,7 +110,7 @@ public float GetKnowledgeSum()
/// <returns></returns>
public float GetKnowledgePotential()
{
return Expertise.List.Sum(l => l.GetKnowledgePotential());
return Expertise.GetAgentKnowledges<AgentKnowledge>().Sum(l => l.GetKnowledgePotential());
}
/// <summary>
/// Percentage of all Knowledge of the agent for all knowledge during the simulation
Expand All @@ -135,7 +136,7 @@ public float PercentageKnowledge
/// </summary>
public float Obsolescence(float step)
{
return Expertise.List.Any() ? Expertise.List.Average(t => t.KnowledgeBits.Obsolescence(step)) : 0;
return Expertise.List.Any() ? Expertise.GetAgentKnowledges<AgentKnowledge>().Average(t => t.KnowledgeBits.Obsolescence(step)) : 0;
}
#endregion

Expand All @@ -151,7 +152,37 @@ public void InitializeExpertise(ushort step)
}

_knowledgeNetwork.AddAgentId(_agentId, Expertise);
_knowledgeNetwork.InitializeExpertise(_agentId, !_knowledgeAndBeliefs.HasInitialKnowledge, step);
//_knowledgeNetwork.InitializeExpertise(_agentId, !_knowledgeAndBeliefs.HasInitialKnowledge, step);

foreach (var agentKnowledge in _knowledgeNetwork.GetAgentExpertise(_agentId).List)
{
InitializeAgentKnowledge((AgentKnowledge)agentKnowledge, !_knowledgeAndBeliefs.HasInitialKnowledge, step);
}
}



/// <summary>
/// Initialize AgentExpertise with a stochastic process based on the agent knowledge level
/// </summary>
/// <param name="agentKnowledge">AgentKnowledge to initialize</param>
/// <param name="neutral">if !HasInitialKnowledge, then a neutral (KnowledgeLevel.NoKnowledge) initialization is done</param>
/// <param name="step"></param>
public void InitializeAgentKnowledge(AgentKnowledge agentKnowledge, bool neutral, ushort step)
{
if (agentKnowledge is null)
{
throw new ArgumentNullException(nameof(agentKnowledge));
}

var knowledge = GetKnowledge(agentKnowledge.KnowledgeId);
if (knowledge == null)
{
throw new ArgumentNullException(nameof(knowledge));
}

var level = neutral ? KnowledgeLevel.NoKnowledge : agentKnowledge.KnowledgeLevel;
agentKnowledge.InitializeKnowledge(knowledge.Length, _knowledgeNetwork.Model, level, step);
}

/// <summary>
Expand All @@ -161,7 +192,7 @@ public void InitializeExpertise(ushort step)
/// <param name="step"></param>
public void InitializeKnowledge(IId knowledgeId, ushort step)
{
_knowledgeNetwork.InitializeAgentKnowledge(GetKnowledge(knowledgeId),
InitializeAgentKnowledge(GetAgentKnowledge(knowledgeId),
!_knowledgeAndBeliefs.HasInitialKnowledge, step);
}

Expand Down Expand Up @@ -211,7 +242,8 @@ public void AddKnowledge(IId knowledgeId, KnowledgeLevel level, float minimumKno
return;
}

_knowledgeNetwork.Add(_agentId, knowledgeId, level, minimumKnowledge, timeToLive);
var agentKnowledge = new AgentKnowledge(knowledgeId, level, minimumKnowledge, timeToLive);
_knowledgeNetwork.Add(_agentId, agentKnowledge);
}


Expand Down Expand Up @@ -246,7 +278,7 @@ public void AddKnowledge(IId knowledgeId, KnowledgeLevel level, float minimumKno
return null;
}

var agentKnowledge = Expertise.GetKnowledge(knowledgeId);
var agentKnowledge = GetAgentKnowledge(knowledgeId);
if (agentKnowledge is null)
{
throw new ArgumentNullException(nameof(agentKnowledge));
Expand Down Expand Up @@ -287,9 +319,14 @@ public void AddKnowledge(IId knowledgeId, KnowledgeLevel level, float minimumKno
return Math.Abs(bitsToSend.GetSum()) < Tolerance ? null : bitsToSend;
}

public AgentKnowledge GetKnowledge(IId knowledgeId)
public AgentKnowledge GetAgentKnowledge(IId knowledgeId)
{
return Expertise.GetAgentKnowledge<AgentKnowledge>(knowledgeId);
}

public Knowledge GetKnowledge(IId knowledgeId)
{
return Expertise.GetKnowledge(knowledgeId);
return _knowledgeNetwork.GetKnowledge<Knowledge>(knowledgeId);
}

#region KnowsEnough
Expand Down Expand Up @@ -341,8 +378,7 @@ public bool KnowsEnough(IId knowledgeId, byte knowledgeBit, float knowledgeThres
return false;
}

var knowledge = GetKnowledge(knowledgeId);
return KnowsEnough(knowledge, knowledgeBit, knowledgeThreshHoldForAnswer, step);
return KnowsEnough(GetAgentKnowledge(knowledgeId), knowledgeBit, knowledgeThreshHoldForAnswer, step);
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using Symu.Common.Interfaces.Agent;
using Symu.Common.Interfaces.Entity;
using Symu.Common.Math.ProbabilityDistributions;
using Symu.Repository.Entity;
using Symu.Repository.Networks.Knowledges;
using static Symu.Common.Constants;

Expand Down Expand Up @@ -63,7 +64,7 @@ public float PercentageLearning
/// <returns></returns>
public float GetKnowledgePotential()
{
return Expertise.List.Sum(l => l.GetKnowledgePotential());
return Expertise.GetAgentKnowledges<AgentKnowledge>().Sum(l => l.GetKnowledgePotential());
}

public LearningModel(AgentId agentId, OrganizationModels models, KnowledgeNetwork knowledgeNetwork,
Expand Down Expand Up @@ -165,8 +166,8 @@ public void Learn(IId knowledgeId, Bits knowledgeBits, float maxRateLearnable, u
throw new ArgumentNullException(nameof(knowledgeBits));
}

_knowledgeNetwork.LearnNewKnowledge(_id, knowledgeId, minimumKnowledge, timeToLive, step);
var agentKnowledge = Expertise.GetKnowledge(knowledgeId);
LearnNewKnowledge(_id, knowledgeId, minimumKnowledge, timeToLive, step);
var agentKnowledge = Expertise.GetAgentKnowledge<AgentKnowledge>(knowledgeId);
Learn(knowledgeBits, maxRateLearnable, agentKnowledge, step);
}

Expand Down Expand Up @@ -225,8 +226,8 @@ public float Learn(IId knowledgeId, byte knowledgeBit, float minimumKnowledge, s
return 0;
}

_knowledgeNetwork.LearnNewKnowledge(_id, knowledgeId, minimumKnowledge, timeToLive, step);
return AgentKnowledgeLearn(Expertise.GetKnowledge(knowledgeId), knowledgeBit, NextLearning(), step);
LearnNewKnowledge(_id, knowledgeId, minimumKnowledge, timeToLive, step);
return AgentKnowledgeLearn(Expertise.GetAgentKnowledge<AgentKnowledge>(knowledgeId), knowledgeBit, NextLearning(), step);
}

/// <summary>
Expand Down Expand Up @@ -291,8 +292,8 @@ public float LearnByDoing(IId knowledgeId, byte knowledgeBit, ushort step)
return 0;
}

_knowledgeNetwork.LearnNewKnowledge(_id, knowledgeId, minimumKnowledge, timeToLive, step);
return AgentKnowledgeLearn(Expertise.GetKnowledge(knowledgeId), knowledgeBit, NextLearningByDoing(), step);
LearnNewKnowledge(_id, knowledgeId, minimumKnowledge, timeToLive, step);
return AgentKnowledgeLearn(Expertise.GetAgentKnowledge<AgentKnowledge>(knowledgeId), knowledgeBit, NextLearningByDoing(), step);
}

public float NextLearning()
Expand Down Expand Up @@ -325,6 +326,27 @@ public float NextLearningByDoing()
LearningStandardDeviationValue(TasksAndPerformance.LearningStandardDeviation);
return TasksAndPerformance.LearningByDoingRate * Normal.Sample(1, stdDev * _randomLevel);
}
/// <summary>
/// Agent don't have still this Knowledge, it's time to create one
/// </summary>
/// <param name="agentId"></param>
/// <param name="knowledgeId"></param>
/// <param name="minimumKnowledge"></param>
/// <param name="timeToLive"></param>
/// <param name="step"></param>
public void LearnNewKnowledge(IAgentId agentId, IId knowledgeId, float minimumKnowledge, short timeToLive,
ushort step)
{
if (_knowledgeNetwork.Exists(agentId, knowledgeId))
{
return;
}

var agentKnowledge = new AgentKnowledge(knowledgeId, KnowledgeLevel.NoKnowledge, minimumKnowledge, timeToLive);
_knowledgeNetwork.Add(agentId, agentKnowledge);
var knowledge = _knowledgeNetwork.GetKnowledge<Knowledge>(knowledgeId);
agentKnowledge.InitializeKnowledge(knowledge.Length, _knowledgeNetwork.Model, KnowledgeLevel.NoKnowledge, step);
}

private static float LearningStandardDeviationValue(GenericLevel level)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#region using directives

using System;
using Symu.Repository.Entity;
using Symu.Repository.Networks.Knowledges;

#endregion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using Symu.Classes.Agents.Models.CognitiveModels;
using Symu.Classes.Task;
using Symu.Common.Interfaces.Entity;
using Symu.Repository.Entity;
using Symu.Repository.Networks.Knowledges;

#endregion
Expand Down Expand Up @@ -59,7 +60,7 @@ public class MurphyIncompleteKnowledge : MurphyIncomplete
}

// agent may don't have the knowledge at all
var workerKnowledge = knowledgeModel.Expertise.GetKnowledge(knowledgeId);
var workerKnowledge = knowledgeModel.Expertise.GetAgentKnowledge<AgentKnowledge>(knowledgeId);
if (workerKnowledge == null)
{
return;
Expand Down
5 changes: 3 additions & 2 deletions SourceCode/Symu/Classes/Task/MurphyTask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using Symu.Classes.Murphies;
using Symu.Common.Interfaces.Entity;
using Symu.Common.Math.ProbabilityDistributions;
using Symu.Repository.Entity;
using Symu.Repository.Networks.Knowledges;
using static Symu.Common.Constants;

Expand Down Expand Up @@ -127,7 +128,7 @@ public float MandatoryBitsRatio(float level)
/// complexity = 0.3
/// GetTaskRequiredBits = [359] : index 3, 5 and 9 are required
/// </example>
public byte[] GetTaskRequiredBits(IKnowledge knowledge, float complexity)
public byte[] GetTaskRequiredBits(Knowledge knowledge, float complexity)
{
if (knowledge is null || knowledge.Length == 0)
{
Expand All @@ -152,7 +153,7 @@ public byte[] GetTaskRequiredBits(IKnowledge knowledge, float complexity)
/// complexity = 0.2
/// GetTaskMandatoryBits = [17] : index 1 and 7 are mandatory
/// </example>
public byte[] GetTaskMandatoryBits(IKnowledge knowledge, float complexity)
public byte[] GetTaskMandatoryBits(Knowledge knowledge, float complexity)
{
if (knowledge is null || knowledge.Length == 0)
{
Expand Down
3 changes: 2 additions & 1 deletion SourceCode/Symu/Classes/Task/SymuTask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
using Symu.Common;
using Symu.Common.Interfaces.Agent;
using Symu.Common.Interfaces.Entity;
using Symu.Repository.Entity;
using Symu.Repository.Networks.Knowledges;
using Symu.Results.Blocker;
using static Symu.Common.Constants;
Expand Down Expand Up @@ -196,7 +197,7 @@ public void SetKnowledgesBits(MurphyTask model, IEnumerable<IKnowledge> knowledg
throw new ArgumentNullException(nameof(knowledges));
}

foreach (var knowledge in knowledges)
foreach (var knowledge in knowledges.Cast<Knowledge>())
{
var bit = new TaskKnowledgeBits
{
Expand Down
1 change: 1 addition & 0 deletions SourceCode/Symu/Messaging/Messages/MessageAttachments.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
using System;
using System.Collections.Generic;
using Symu.Common.Interfaces.Entity;
using Symu.Repository.Entity;
using Symu.Repository.Networks.Knowledges;

#endregion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
using System;
using Symu.Common;
using Symu.Common.Math.ProbabilityDistributions;
using Symu.Repository.Entity;
using Symu.Repository.Networks.Knowledges;

#endregion
Expand Down

0 comments on commit ac18f98

Please sign in to comment.