Skip to content

ClassDefinition_step5

RoiArthurB edited this page Jul 30, 2026 · 4 revisions

Advanced Features

Objects as Agent Attributes

Objects can be stored in any GAML variable — global, species, local, etc.

species node_agent skills: [moving] {
	
	/** Incoming messages queued for this agent. */
	list<message_object> inbox <- [];
	
	/** Current velocity vector. */
	vec2 velocity <- vec2(dx: rnd(2.0) - 1.0, dy: rnd(2.0) - 1.0);
}

global {
	geometry shape <- square(100);
	
	init {
		create node_agent number: 10;
	}
}

Passing Objects Between Agents

Objects follow GAML value semantics — assigning to a variable copies the reference, not the object. Both agents hold a reference to the same object in memory:

species node_agent skills: [moving] {
	
	list<message_object> inbox <- [];
	
	/** Receives a message object. */
	action receive_message(message_object msg) {
		inbox <+ msg;
	}
	
	/**
	 * Creates and returns a new message object.
	 * Returning an object from an agent action is identical to returning any other value.
	 */
	message_object compose(string msg_content, int msg_priority) {
		return message_object(sender_name: name,
		               content: msg_content,
		               priority: msg_priority);
	}
}

global {
	init {
		create node_agent number: 5;
	}
}

global {
	init {
		node_agent sender <- first(node_agent);
		message_object m1 <- sender.compose("Hello world", 2);
		
		node_agent recipient <- last(node_agent);
		ask recipient { do receive_message(m1); }
		write recipient.name + " inbox size: " + length(recipient.inbox);
		
		// Both sender and recipient hold a reference to THE SAME object
		write "Same object? " + (m1 = recipient.inbox[0]);   // true: reference equality
	}
}

Objects as Return Values

Actions in any class can return objects — including actions in agents:

vec2 add(vec2 other) {
	return vec2(dx: dx + other.dx, dy: dy + other.dy);
}

This enables chaining:

vec2 combined <- v1.add(v2).scale(0.5);
// Creates a sum, then scales it — zero intermediate variables

Objects as Experiment Parameters

experiment Advanced_Features title: "Advanced Features" type: gui {
	
	/** Number of nodes — also used as a parameter in the GUI. */
	parameter "Number of nodes" var: nb_nodes min: 2 max: 50 category: "Setup";
	
	output {
		display Nodes title: "Nodes" type: 2d {
			species node_agent;
		}
	}
}

The nb_nodes integer parameter can be used in the model to control species population size.

Polymorphic Objects in Agent Collections

Objects inside agent collections can be any type — including polymorphic lists:

// Send messages between random pairs
loop i from: 1 to: 3 {
	node_agent s <- any(node_agent);
	node_agent r <- any(node_agent where (each != s));
	if r != nil {
		message_object msg <- s.compose("ping #" + i, i);
		ask r { do receive_message(msg); }
	}
}

// Accumulate all messages across all agents
list<message_object> all_msgs <- node_agent accumulate each.inbox;
list<message_object> sorted <- all_msgs sort_by (-each.priority);

Object Identity

The equality operator = on objects tests reference identity by default — two objects are the same iff they are the exact same instance:

vec2 a <- vec2(dx: 3.0, dy: 4.0);
vec2 b <- vec2(dx: 3.0, dy: 4.0);   // different object, same values
vec2 c <- a;                          // same reference as a

write "a = b (same reference)? " + (a = b);          // false (different instances)
write "a = c (same reference)? " + (a = c);          // true (same instance)

Objects as Map Keys

Objects can be used as keys in maps since they support identity-based hashing:

map<vec2, string> labels;
labels[a] <- "origin vector";
labels[b] <- "copy vector";

write "labels[a] = " + labels[a];       // "origin vector"
write "labels[b] = " + labels[b];       // "copy vector"
write "labels[c] = " + labels[c];       // "origin vector" — c shares ref with a

Objects + Species: Full Integration

The advanced features model shows how objects and species work together in a complete simulation:

// Supporting classes
class vec2 {
	float dx <- 0.0;
	float dy <- 0.0;
	
	float norm() { return sqrt(dx ^ 2 + dy ^ 2); }
	vec2 add(vec2 other) { return vec2(dx: dx + other.dx, dy: dy + other.dy); }
	vec2 scale(float factor) { return vec2(dx: dx * factor, dy: dy * factor); }
	string to_string() { return "(" + (dx with_precision 2) + ", " + (dy with_precision 2) + ")"; }
}

class message_object {
	string sender_name <- "unknown";
	string content <- "";
	int priority <- 1;
	bool read_flag <- false;
	
	string consume() { read_flag <- true; return content; }
	string to_string() { return "[msg p=" + priority + (read_flag ? " ✓" : "  ")
	                            + "] from=" + sender_name + " : " + content; }
}

// Species with objects as attributes
species node_agent skills: [moving] {
	
	list<message_object> inbox <- [];
	vec2 velocity <- vec2(dx: rnd(2.0) - 1.0, dy: rnd(2.0) - 1.0);
	float energy <- 100.0;
	
	action receive_message(message_object msg) {
		inbox <+ msg;
	}
	
	int process_inbox() {
		int count <- length(inbox);
		loop msg over: inbox {
			string text <- msg.consume();
			energy <- energy - msg.priority * 0.5;
		}
		inbox <- [];
		return count;
	}
	
	message_object compose(string msg_content, int msg_priority) {
		return message_object(sender_name: name, content: msg_content, priority: msg_priority);
	}
	
	reflex drift {
		location <- {(location.x + velocity.dx) mod world.shape.width,
		             (location.y + velocity.dy) mod world.shape.height};
	}
	
	reflex check_mail when: !empty(inbox) {
		int n <- process_inbox();
	}
	
	reflex recharge {
		energy <- min(100.0, energy + 0.2);
	}
	
	aspect default {
		float r <- max(1.0, energy / 20.0);
		draw circle(r) color: rgb(int(energy * 2.55), 100, 50) border: #white;
		if !empty(inbox) {
			draw string(length(inbox)) at: location + {0, -r - 0.5}
				color: #yellow size: 2.0;
		}
	}
}

global {
	geometry shape <- square(100);
	int nb_nodes <- 10;
	
	init { create node_agent number: nb_nodes; }
	
	message_object create_random_message() {
		return message_object(sender_name: "system", content: "test", priority: rnd(5));
	}
}

experiment Advanced_Features title: "Advanced Features" type: gui {
	parameter "Number of nodes" var: nb_nodes min: 2 max: 50 category: "Setup";
	output {
		display Nodes title: "Nodes" type: 2d {
			species node_agent;
		}
	}
}

Key Takeaways

Feature Description
Objects as agent attributes list<message> inbox <- []; inside species
Passing objects between agents Action arguments — reference is shared
Returning objects from actions Same syntax as returning any value
Chaining action returns v1.add(v2).scale(0.5) — no intermediate vars
Object identity a = b returns true only if same instance
Objects as map keys map<ClassName, T> m; m[an_object] <- value;
Experiment parameters parameter "Label" var: class_instance_type;
Aggregating objects Species accumulate each.obj_attr

See Also

  1. What's new (Changelog)
  2. Migration Guide (2025-06 → 2026-06)
  1. Installation and Launching
    1. Installation
    2. Launching GAMA
    3. Updating GAMA
    4. Installing Plugins
  2. Workspace, Projects and Models
    1. Navigating in the Workspace
    2. Changing Workspace
    3. Importing Models
  3. Editing Models
    1. GAML Editor (Generalities)
    2. GAML Editor Tools
    3. Validation of Models
  4. Running Experiments
    1. Launching Experiments
    2. Experiments User interface
    3. Controls of experiments
    4. Parameters view
    5. Inspectors and monitors
    6. Displays
    7. Batch Specific UI
    8. Errors View
  5. Running Headless
    1. Getting Started
    2. Headless Legacy
    3. Headless Batch
  6. Preferences
  7. Troubleshooting
  1. Introduction
    1. Start with GAML
    2. Organization of a Model
    3. Basic programming concepts in GAML
  2. Manipulate basic Species
  3. Global Species
    1. Regular Species
    2. Defining Actions and Behaviors
    3. Interaction between Agents
    4. Attaching Skills
    5. Inheritance
  4. Defining Advanced Species
    1. Grid Species
    2. Graph Species
    3. Mirror Species
    4. Multi-Level Architecture
  5. Defining GUI Experiment
    1. Defining Parameters
    2. Defining Displays Generalities
    3. Defining 3D Displays
    4. Defining Charts
    5. Defining Monitors and Inspectors
    6. Defining Export files
    7. Defining User Interaction
  6. Classes and Objects
    1. Class Definition and Instantiation
    2. Attributes and Actions
    3. Inheritance
    4. Virtual Classes
    5. Advanced Features
  7. Exploring Models
    1. Run Several Simulations
    2. Batch Experiments
    3. Exploration Methods
  8. Optimizing Models
    1. Runtime Concepts
    2. Analyzing code performance
    3. Optimizing Models
  9. Multi-Paradigm Modeling
    1. Control Architecture
    2. Defining Differential Equations
  1. Manipulate OSM Data
  2. Cleaning OSM Data
  3. Diffusion
  4. Using Database
  5. Using Dataframes
  6. Using FIPA ACL
  7. Using BDI with BEN
  8. Using Driving Skill
  9. Manipulate dates
  10. Manipulate lights
  11. Using comodel
  12. Save and restore Simulations
  13. Using network
  14. Writing Unit Tests
  15. Ensure model's reproducibility
  16. Going further with extensions
    1. Calling R
    2. Using Graphical Editor
    3. Using Git from GAMA
  1. Built-in Species
  2. Built-in Skills
  3. Built-in Architecture
  4. Statements
  5. Data Type
  6. File Type
  7. Stats Extension
  8. Sound Extension
  9. BDI Extension
  10. FIPA Skill
  11. Expressions
    1. Literals
    2. Units and Constants
    3. Pseudo Variables
    4. Variables And Attributes
    5. Operators (Definition)
    6. Operators [A-A]
    7. Operators [B-C]
    8. Operators [D-H]
    9. Operators [I-M]
    10. Operators [N-R]
    11. Operators [S-Z]
  12. Exhaustive list of GAMA Keywords
  1. Installing the development version
    1. Install GAMA source code with Eclipse plugin
  2. Developing Extensions
    1. Developing Plugins
    2. Developing Skills
    3. Developing Statements
    4. Developing Operators
    5. Developing Types
    6. Developing Species
    7. Developing Control Architectures
    8. Index of annotations
  3. Introduction to GAMA Java API
    1. Architecture of GAMA
    2. IScope
  4. Using GAMA flags
  5. Creating a release of GAMA
  6. Documentation generation

  1. Predator Prey
  2. Road Traffic
  3. Incremental Model
  4. Luneray's flu
  5. BDI Agents
  6. Forager RL
  7. SIR Analysis
  8. 3D Model

  1. Team
  2. Projects using GAMA
  3. Scientific References
  4. Training Sessions

Resources

  1. Videos
  2. Conferences
  3. Pedagogical materials

Clone this wiki locally