##
# the width and height of the actual simulation
##
FIELD_WIDTH: 500
FIELD_HEIGHT: 500

##
# width and height of the visualization window
# doesn't have to be the same as FIELD_WIDTH and FIELD_HEIGHT from above
##
DISPLAY_WIDTH: 400
DISPLAY_HEIGHT: 400

##
# used when creating the continuous 2D objects
# I usually try to set SENSOR_DISCRETIZATION to the maximum communication distance of the sensors,
#   and EMITTER_DISCRETIZATION to the maximum emit distance of any emitter
##
SENSOR_DISCRETIZATION: 15
EMITTER_DISCRETIZATION: 250

##
# background color of the visualization
##
BACKGROUND_COLOR: 255 255 255

##
# WRITE_DATA: [write]
#   - write -> boolean value indicating whether or not to write output file for this run
#
# DATA_WRITE_INTERVAL: [interval]
#   - interval -> positive int value indicating how often to write data
#
# OUTPUT_DIR: [directory]
#   - directory -> String value indicating the directory that the output should be written (if WRITE_DATA == true)
##
WRITE_DATA: false
DATA_WRITE_INTERVAL: 1
OUTPUT_DIR: output

##
# Number of frequencies used in the system.
# The colors indicate how the agents are drawn.
#
# Make sure that there is a 'SENSOR_COLOR_n: R G B [A]' and 'EMITTER_COLOR_n: R G B [A]' line for each n = [1,NUM_FREQUENCIES].
# R, G, B are for red, green, blue
# A can be added for the alpha channel; however, adding this slows down the simulation.
##
NUM_FREQUENCIES: 4

SENSOR_COLOR_1: 255 0 0
SENSOR_COLOR_2: 0 255 0
SENSOR_COLOR_3: 0 0 255
SENSOR_COLOR_4: 255 255 0
SENSOR_COLOR_5: 255 0 255
SENSOR_COLOR_6: 0 255 255

EMITTER_COLOR_1: 255 0 0 128
EMITTER_COLOR_2: 0 255 0 128
EMITTER_COLOR_3: 0 0 255 128
EMITTER_COLOR_4: 255 255 0 128
EMITTER_COLOR_5: 255 0 255 128
EMITTER_COLOR_6: 0 255 255 128

##
# The following parameters indicate how the sensors are created.
# 
# NUM_SENSOR_GROUPS: [num]
#   - num -> int value indicating the number of sensor groups that will follow
#   - each sensor group is numbered [1,n] (where n is the value given in NUM_SENSOR_GROUPS), and
#     should contain each of the following parameters (described in more detail below
#     - SENSOR_POSITIONER_i
#     - SENSOR_PHYSICAL_RADIUS_i
#     - SENSOR_COMM_DISTANCE_i
#     - SENSOR_UPDATE_PROBABILITY_i
#     - SENSOR_INITIAL_FREQUENCY_ASSIGNER_i
#     - SENSOR_MOVER_i
#     - SENSOR_FREQUENCY_UPDATER_i
#
# SENSOR_POSITIONER_i: [options described below]
#   - determines how the sensors are placed in the environment, and the parameters can take on any
#     of the following forms:
#
#   - SinglePositioner [x] [y]
#     - x -> double value indicating the x-coordinate of the sensor
#     - y -> double value indicating the y-coordinate of the sensor
#     - creates a single sensor at the given coordinates
#
#   - GridPositioner [rows] [cols] [xAnchor] [yAnchor] [width] [height]
#     - rows -> int value indicating the number of rows in the grid of sensors
#     - cols -> int value indicating the number of columns in the grid of sensors
#     - xAnchor -> double value indicating the location of the upper-left-most sensor in the grid
#     - yAnchor -> double value indicating the location of the upper-left-most sensor in the grid
#     - width -> double value indicating the width of the grid
#     - height -> double value indicating the height of the grid
#     - creates a grid of rows-by-cols sensors evenly spaced in the specified area
#
# SENSOR_PHYSICAL_RADIUS_i: [radius]
#   - radius -> double value indicating the radius of sensors when they are drawn
#   - does not affect the dynamics of a simulation as sensors (and emitters) are always treated as point objects
#
# SENSOR_COMM_DISTANCE_i: [distance]
#   - distance -> double value indicating the distance that sensors broadcast data to neighboring sensors
# 
# SENSOR_UPDATE_PROBABILITY_i: [probability]
#   - probability -> double value indicating the probability that a sensor update its frequency each time step
#
# SENSOR_INITIAL_FREQUENCY_ASSIGNER_i: [options described below]
#   - determines how the sensors are initially assigned their frequency
#   - the parameters can take on any of the following:
#
#   - RandomAssigner
#     - assigns frequencies randomly
#
#   - HomogeneousAssigner [frequency]
#     - assigns all of the sensors to the given frequency
#     - make sure the frequency is in the range [0, NUM_FREQUENCIES-1]
#
# SENSOR_MOVER_i: [options described below]
#   - indicates how the sensors move about in their environment
#   - the parameters can take on any of the following:
#
#   - StationaryMover
#     - sensors do not move
#
#   - FixedWaypointMover [x1] [y1] [x2] [y2] ... [xn] [yn]
#     - x1, y1, x2, y2, ... -> double values indicating the waypoints that the sensor moves to
#     - once the sensor has reached the first waypoint, that is, location (x1, y1), the
#       sensor starts moving to the second point (x2, y2), etc.
#     - once the sensor has reached point (xn, yn), the sensor begins moving back to (x1, y1)
#
#   - RandomWaypointMover [xAnchor] [yAnchor] [width] [height]
#     - xAnchor -> double value indicating the location of the upper-left-most point in the bounding area
#     - yAnchor -> double value indicating the location of the upper-left-most point in the bounding area
#     - width -> double value indicating the width of the bounding area
#     - height -> double value indicating the height of the bounding area
#     - A waypoint is randomly generated in the given area, once the sensor reaches that point,
#       a new waypoint is randomly generated, and the sensor heads towards it.  This process is
#       repeated infinitely.
#
# SENSOR_FREQUENCY_UPDATER_i: [options described below]
#   - indicates the algorithm that the sensors use to determine which frequency to sense
#   - the parameters can take on any of the following:
#
#   - Method1FrequencyUpdater
#     - uses own frequency when computing frequency-counts and may switch out of own frequency
#       when it ties any other frequency for least represented
#     - Method1 from AAMAS 2009 paper (Campbell and Wu)
#
#   - Method2FrequencyUpdater
#     - does not use own frequency when computing frequency-counts and will not switch out
#       of own frequency if it is tied with other frequency(s) as the least represented
#     - Method2 from AAMAS 2009 paper (Campbell and Wu)
#
#   - Method3FrequencyUpdater
#     - randomly chooses frequency
#     - Method3 from AAMAS 2009 paper (Campbell and Wu)
#
#   - StationaryFrequencyUpdater
#     - does nothing, i.e., frequencies don't change
##
NUM_SENSOR_GROUPS: 1

SENSOR_POSITIONER_1:                 GridPositioner 20 20 50 50 400 400
SENSOR_PHYSICAL_RADIUS_1:            5
SENSOR_COMM_DISTANCE_1:              25
SENSOR_UPDATE_PROBABILITY_1:         1.0
SENSOR_INITIAL_FREQUENCY_ASSIGNER_1: HomogeneousAssigner 0
SENSOR_MOVER_1:                      RandomWaypointMover 0 0 500 500
SENSOR_FREQUENCY_UPDATER_1:          Method2FrequencyUpdater

##
# The following parameters indicate how the emitters are created.
# 
# NUM_EMITTER_GROUPS: [num]
#   - num -> int value indicating the number of emitter groups that will follow
#   - each emitter group is numbered [1,n] (where n is the value given in NUM_EMITTER_GROUPS), and
#     should contain each of the following parameters (described in more detail below
#     - EMITTER_POSITIONER_i
#     - EMITTER_PHYSICAL_RADIUS_i
#     - EMITTER_SIGNAL_INFO_i
#     - EMITTER_INITIAL_FREQUENCY_ASSIGNER_i
#     - EMITTER_SIGNAL_CONTROLLER_i
#     - EMITTER_MOVER_i
#
# EMITTER_POSITIONER_i: [options described below]
#   - determines how the emitters are placed in the environment
#   - look at SENSOR_POSITIONER_i above for more details
#
# EMITTER_PHYSICAL_RADIUS_i: [radius]
#   - radius -> double value indicating the radius of emitters when they are drawn
#   - does not affect the dynamics of a simulation as emitters (and sensors) are always treated as point objects
#
# EMITTER_SIGNAL_INFO_i: [emitDirectionX] [emitDirectionY] [emitDistance] [emitSpread]
#   - senseDirectionX -> double value indicating the x-direction the emitter is initially emitting its signal
#   - senseDirectionY -> double value indicating the y-direction the emitter is initially emitting its signal
#   - emitDistance -> double value indicating how far this emitter's signal travels
#   - emitSpread -> double value indicating the the total angle that the signal spreads
#
# EMITTER_INITIAL_FREQUENCY_ASSIGNER_i: [options described below]
#   - determines how the sensors are initially assigned their frequency
#   - look at SENSOR_INITIAL_FREQUENCY_ASSIGNER_i above for more details
#
# EMITTER_SIGNAL_CONTROLLER_i: [options described below]
#   - indicates how the emitter determines where to direct its signal; options are as follows:
#
#   - StationarySignalController
#     - does nothing to the direction of the emitters' initial signal directions
#
#   - FixedPointSignalController [targetX] [targetY]
#     - targetX -> double value indicating the x-coordinate of targeted point
#     - targetY -> double value indicating the y-coordinate of targeted point
#     - the emitter will always point its signal towards the target point
# 
# EMITTER_MOVER_i: [options described below]
#   - indicates how the sensors move about in their environment
#   - look at SENSOR_MOVER_i above for more details
##
NUM_EMITTER_GROUPS: 3

EMITTER_POSITIONER_1:                 SinglePositioner 0 0
EMITTER_PHYSICAL_RADIUS_1:            5
EMITTER_SIGNAL_INFO_1:                0 1 250 30
EMITTER_INITIAL_FREQUENCY_ASSIGNER_1: HomogeneousAssigner 0
EMITTER_SIGNAL_CONTROLLER_1:          FixedPointSignalController 250 250
EMITTER_MOVER_1:                      FixedWaypointMover 0 0 0 500 500 500 500 0

EMITTER_POSITIONER_2:                 SinglePositioner 100 100
EMITTER_PHYSICAL_RADIUS_2:            5
EMITTER_SIGNAL_INFO_2:                0 1 150 30
EMITTER_INITIAL_FREQUENCY_ASSIGNER_2: HomogeneousAssigner 1
EMITTER_SIGNAL_CONTROLLER_2:          FixedPointSignalController 250 250
EMITTER_MOVER_2:                      FixedWaypointMover 100 100 100 400 400 400 400 100

EMITTER_POSITIONER_3:                 SinglePositioner 200 200
EMITTER_PHYSICAL_RADIUS_3:            5
EMITTER_SIGNAL_INFO_3:                0 1 50 30
EMITTER_INITIAL_FREQUENCY_ASSIGNER_3: HomogeneousAssigner 2
EMITTER_SIGNAL_CONTROLLER_3:          FixedPointSignalController 250 250
EMITTER_MOVER_3:                      FixedWaypointMover 200 200 200 300 300 300 300 200