Class: Distem::Events::EventGenerator

Inherits:
Event
  • Object
show all
Defined in:
lib/distem/events/eventgenerator.rb

Overview

Class to generate events from a probabilist distribution

Instance Method Summary (collapse)

Methods inherited from Event

#<=>

Constructor Details

- (EventGenerator) initialize(resource_desc, change_type, generator_desc, event_value = nil, random_generators = nil)

Returns a new instance of EventGenerator



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/distem/events/eventgenerator.rb', line 8

def initialize(resource_desc, change_type, generator_desc, event_value = nil, random_generators = nil)

  @generator_desc = generator_desc
  @random_generators = {}
  @random_generators = random_generators if random_generators

  if change_type == 'churn'
    event_value = 'down' unless event_value

    if @generator_desc['date']
      if @generator_desc['availability'] or @generator_desc['unavailability']
        raise "You cannot give a date generator and an availability or unavailability generator"
      end

      # same distribution for avaibility and unavailability time
      @generator_desc['availability'] = @generator_desc['date']
      @generator_desc['unavailability'] = @generator_desc['date']
      @generator_desc['date'] = nil
    else
      unless @generator_desc['availability'] and @generator_desc['unavailability']
        raise "You must give availability and unavailability generators"
      end
    end

    @random_generators['availability'] = RngStreamRandomGenerator.new unless @random_generators['availability']
    @random_generators['unavailability'] = RngStreamRandomGenerator.new unless @random_generators['unavailability']

  else
    raise "No description given for the date generator" unless @generator_desc['date']
    raise "No description given for the value generator" unless @generator_desc['value']

    @random_generators['value'] = RngStreamRandomGenerator.new unless @random_generators['value']

    event_value = get_random_value('value')
    if change_type == 'power'
      # For this event,  non-integer values are accepted only if between 0 and 1
      event_value = event_value.round if event_value > 1
    else
      #No integer value allowed - As 0 means infinity in some cases, we only start from 1
      event_value = event_value.round
      event_value = 1 if event_value == 0
    end
  end

  super(resource_desc, change_type, event_value)

  @random_generators['date'] = RngStreamRandomGenerator.new unless @random_generators['date']

end

Instance Method Details

- (Object) get_next_date



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/distem/events/eventgenerator.rb', line 58

def get_next_date
  if @change_type == 'churn'
    if @event_value == 'down'
      # The resource will be down on the next trigger; for the moment, it should be up.
      # So we use the availability distribution to compute the next date
      return get_random_value('availability')
    else
      return get_random_value('unavailability')
    end
  else
    return get_random_value('date')
  end
end

- (Object) trigger(event_list, date)



72
73
74
75
76
77
78
79
80
# File 'lib/distem/events/eventgenerator.rb', line 72

def trigger(event_list, date)
  super
  generated_date = get_next_date
  if generated_date
    next_event = get_next_event
    next_date = generated_date + date
    event_list.add_event(next_date, next_event)
  end
end