Skip to content

Commit f038c6d

Browse files
authored
Merge pull request #9 from NiceOneFox/T8_SimulateProgram
Close T8 simulate program
2 parents 5695986 + 42dd720 commit f038c6d

File tree

12 files changed

+157
-51
lines changed

12 files changed

+157
-51
lines changed

backend/ServiceSimulation/Bll.Domain/Entities/Device.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ public class Device
55
public int DeviceId { get; set; }
66
public bool IsWorking { get; set; }
77
public Request? Request { get; set; }
8+
public double Lambda { get; set; } = 5;
9+
public double TimeOfDeviceWillBeFree { get; set; } = 0;
810
}

backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ public class DeviceManager : IDeviceManager
1010

1111
private static readonly Random _random = new();
1212

13-
public double Lambda { get; set; }
14-
public double TimeOfDeviceWillBeFree { get; set; }
15-
1613
public DeviceManager(ITimeProvider time, IResults resultChannel)
1714
{
1815
_time = time;
@@ -26,22 +23,23 @@ public void TakeRequest(Request request, Device device)
2623
return;
2724
}
2825
device.Request = request;
26+
device.IsWorking = true;
2927

30-
TimeOfDeviceWillBeFree = _time.Now +(-1.0 / Lambda) * Math.Log(_random.NextDouble());
31-
//TODO COUNT TIME OF WORKING ON THAT REQUEST
28+
device.TimeOfDeviceWillBeFree = _time.Now + (-1.0 / device.Lambda) * Math.Log(_random.NextDouble());
3229
}
3330

3431
public bool FreeDevice(Device device)
3532
{
36-
if (TimeOfDeviceWillBeFree <= _time.Now)
37-
{
38-
device.Request.EndTime = _time.Now;
33+
device.Request.EndTime = _time.Now;
3934

40-
device.Request = null;
41-
device.IsWorking = false;
35+
_time.Now = device.Request.EndTime;
36+
37+
_resultChannel.Processed.Add(device.Request);
38+
39+
40+
device.Request = null;
41+
device.IsWorking = false;
4242

43-
// TODO COUNT THAT REQUEST WHICH IS END WORKING.
44-
}
4543
return true;
4644
}
4745
}

backend/ServiceSimulation/Bll.Domain/Entities/Results.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,10 @@ public class Results : IResults
77
public List<Request> Cancelled { get; set; } = new();
88
public List<Request> Processed { get; set; } = new();
99
public double ModelingTime { get; set; }
10+
public int AmountOfGeneratedRequests { get; set; }
11+
public int AmountOfServedRequest
12+
{
13+
get => Cancelled.Count + Processed.Count;
14+
set { }
15+
}
1016
}

backend/ServiceSimulation/Bll.Domain/Entities/Source.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ public class Source
55
public int SourceId { get; set; }
66
public int Priority { get; set; }
77
public int SerialNumber { get; set; }
8+
public double TimeOfNextRequest { get; set; }
9+
public double Lambda { get; set; } = 5;
810
}

backend/ServiceSimulation/Bll.Domain/Entities/SourceManager.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,28 @@ namespace Bll.Domain.Entities;
44

55
public class SourceManager : ISourceManager
66
{
7-
public ITimeProvider Time { get; set; }
8-
public double TimeOfNextRequest { get; set; }
9-
public double Lambda { get; set; }
7+
private readonly ITimeProvider _time;
8+
9+
private readonly IResults _results;
1010

1111
private static Random _random = new();
12-
public SourceManager(ITimeProvider time)
12+
13+
public SourceManager(ITimeProvider time, IResults results)
1314
{
14-
Time = time;
15+
_time = time;
16+
_results = results;
1517
}
1618

1719
public Request GetNewRequest(Source source)
1820
{
19-
TimeOfNextRequest += -(1.0 / Lambda) * Math.Log(_random.NextDouble());
20-
21-
var generatedRequest = new Request(source.SourceId, source.SerialNumber, TimeOfNextRequest, -1);
21+
var generatedRequest = new Request(source.SourceId, source.SerialNumber, source.TimeOfNextRequest, -1);
22+
23+
source.TimeOfNextRequest += -(1.0 / source.Lambda) * Math.Log(_random.NextDouble());
2224
source.SerialNumber++;
25+
generatedRequest.SerialNumberOfSource = source.SerialNumber; // TODO REFACTOR?
26+
27+
_time.Now = source.TimeOfNextRequest;
28+
_results.AmountOfGeneratedRequests++;
2329

2430
return generatedRequest;
2531
}

backend/ServiceSimulation/Bll.Domain/Entities/StandardBufferManager.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ public StandardBufferManager(IResults resultChannel, ITimeProvider time)
2020

2121
public void Add(Request request)
2222
{
23-
_time.Now = 0.6;
2423
if (_requests.Count >= Capacity)
2524
{
2625
var removedRequest = _requests.Last();
@@ -33,17 +32,15 @@ public void Add(Request request)
3332
_requests.AddFirst(request);
3433
}
3534

36-
public Request? Get()
35+
public Request Get()
3736
{
38-
if (_requests.Count == 0)
39-
{
40-
return null; // TODO THROW EXCEPTION?
41-
}
37+
if (IsFree()) throw new ArgumentNullException("Buffer was empty"); // TODO template string for Ex
4238

4339
var requestFromBuffer = _requests.Last();
4440
_requests.RemoveLast();
4541

4642
return requestFromBuffer;
4743
}
4844

45+
public bool IsFree() => _requests.Count == 0;
4946
}

backend/ServiceSimulation/Bll.Domain/Interfaces/IBufferManager.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ namespace Bll.Domain.Interfaces;
55
public interface IBufferManager
66
{
77
void Add(Request request);
8-
Request? Get();
8+
Request Get();
9+
bool IsFree();
910
}

backend/ServiceSimulation/Bll.Domain/Interfaces/IChannel.cs

Lines changed: 0 additions & 8 deletions
This file was deleted.

backend/ServiceSimulation/Bll.Domain/Interfaces/IResults.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ namespace Bll.Domain.Interfaces;
44

55
public interface IResults
66
{
7-
public List<Request> Cancelled { get; set; }
8-
public List<Request> Processed { get; set; }
7+
List<Request> Cancelled { get; set; }
8+
List<Request> Processed { get; set; }
99
double ModelingTime { get; set; }
10+
int AmountOfGeneratedRequests { get; set; }
11+
int AmountOfServedRequest { get; set; }
1012
}

backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs

Lines changed: 107 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,128 @@ public class SimulationService : ISimulationService
1010
private readonly ISourceManager _sourceManager;
1111
private readonly IDeviceManager _deviceManager;
1212
private readonly IBufferManagerFactory _bufferManagerFactory;
13+
private readonly IResults _results;
1314

14-
public SimulationService(ISourceManager sourceManager, IDeviceManager deviceManager, IBufferManagerFactory bufferManagerFactory)
15+
public SimulationService(ISourceManager sourceManager, IDeviceManager deviceManager, IBufferManagerFactory bufferManagerFactory, IResults results)
1516
{
1617
_sourceManager = sourceManager;
1718
_deviceManager = deviceManager;
1819
_bufferManagerFactory = bufferManagerFactory;
20+
_results = results;
1921
}
2022

2123
public void StartSimulation(InputParameters parameters)
2224
{
23-
// TODO ALGORITHM OF CHOOSING REQUEST FROM SOURCE AND PUT IT ON DEVICE
24-
var source = new Source();
25-
var device = new Device();
25+
List<Source> sources = new List<Source>(parameters.NumberOfSources);
26+
List<Device> devices = new List<Device>(parameters.NumberOfDevices);
27+
28+
for (int i = 0; i < parameters.NumberOfSources; i++)
29+
{
30+
sources.Add(new Source()
31+
{
32+
SourceId = i,
33+
SerialNumber = 0,
34+
Lambda = parameters.Lambda,
35+
Priority = 1,
36+
TimeOfNextRequest = 0,
37+
});
38+
}
39+
40+
for (int i = 0; i < parameters.NumberOfDevices; i++)
41+
{
42+
devices.Add(new Device()
43+
{
44+
DeviceId = i,
45+
IsWorking = false,
46+
Lambda = parameters.Lambda,
47+
Request = null,
48+
TimeOfDeviceWillBeFree = 0,
49+
});
50+
}
2651

2752
var bufferManager = _bufferManagerFactory.CreateBufferManager(parameters.SimulationType);
2853

29-
var request =_sourceManager.GetNewRequest(source);
54+
foreach (var source in sources) // Generate first requests that generated by sources.
55+
{
56+
_sourceManager.GetNewRequest(source);
57+
}
58+
59+
while (true)
60+
{
61+
if (_results.AmountOfGeneratedRequests >= parameters.AmountOfRequests &&
62+
bufferManager.IsFree() &&
63+
IsAllDevicesFree(devices))
64+
{
65+
break;
66+
}
67+
FindNextSpecialEvent(devices, sources, bufferManager, parameters);
68+
}
69+
}
70+
71+
private void FindNextSpecialEvent(List<Device> devices, List<Source> sources, IBufferManager bufferManager, InputParameters parameters)
72+
{
73+
double timeOfClosestRequestCome = double.MaxValue;
74+
double timeOfClosestDeviceFree = double.MaxValue;
3075

31-
bufferManager.Add(request);
76+
int indexOfRequestWithClosestTimeCome = -1;
77+
for (int i = 0; i < sources.Count; i++)
78+
{
79+
if (_results.AmountOfGeneratedRequests >= parameters.AmountOfRequests) break;
80+
if (sources[i].TimeOfNextRequest < timeOfClosestRequestCome)
81+
{
82+
timeOfClosestRequestCome = sources[i].TimeOfNextRequest;
83+
indexOfRequestWithClosestTimeCome = i;
84+
}
85+
}
3286

33-
var requestFromBuffer = bufferManager.Get();
87+
int indexOfDeviceWithClosestTimeFree = -1;
88+
for (int i = 0; i < devices.Count; i++)
89+
{
90+
if (devices[i].IsWorking && devices[i].TimeOfDeviceWillBeFree < timeOfClosestDeviceFree)
91+
{
92+
timeOfClosestDeviceFree = devices[i].TimeOfDeviceWillBeFree;
93+
indexOfDeviceWithClosestTimeFree = i;
94+
}
95+
}
3496

35-
if (requestFromBuffer == null) return;
97+
if (timeOfClosestDeviceFree < timeOfClosestRequestCome)
98+
{
99+
_deviceManager.FreeDevice(devices[indexOfDeviceWithClosestTimeFree]);
100+
101+
// Take from buffer and put on device.
102+
if (!bufferManager.IsFree())
103+
{
104+
_deviceManager.TakeRequest(bufferManager.Get(), devices[indexOfDeviceWithClosestTimeFree]);
105+
}
106+
}
107+
else
108+
{
109+
// Take request on work or add to buffer.
110+
if (_results.AmountOfGeneratedRequests >= parameters.AmountOfRequests) return;
111+
112+
var newRequestInSystem = _sourceManager.GetNewRequest(sources[indexOfRequestWithClosestTimeCome]);
113+
// find out free device
114+
bool wasFreeDevice = false;
115+
foreach (var device in devices)
116+
{
117+
if (!device.IsWorking)
118+
{
119+
_deviceManager.TakeRequest(newRequestInSystem, device);
120+
wasFreeDevice = true;
121+
break;
122+
}
123+
}
124+
125+
if (!wasFreeDevice)
126+
{
127+
// Add request to buffer if no free devices were found
128+
bufferManager.Add(newRequestInSystem);
129+
}
130+
}
36131

37-
_deviceManager.TakeRequest(requestFromBuffer, device);
38132
}
133+
134+
public bool IsAllDevicesFree(List<Device> devices) =>
135+
devices.Any(d => d.IsWorking);
136+
39137
}

0 commit comments

Comments
 (0)