SCML2019World

class scml.scml2019.SCML2019World(products, processes, factories, consumers, miners, factory_managers=None, n_steps=100, time_limit=5400, mechanisms=None, neg_n_steps=20, neg_time_limit=120, neg_step_time_limit=60, negotiation_speed=21, no_bank=False, minimum_balance=0, interest_rate=0.1, interest_max=0.3, installment_interest=0.2, interest_time_increment=0.02, balance_at_max_interest=None, loan_installments=1, no_insurance=False, premium=0.03, premium_time_increment=0.03, premium_breach_increment=0.001, max_allowed_breach_level=None, breach_processing=<BreachProcessing.VICTIM_THEN_PERPETRATOR: 1>, breach_penalty_society=0.1, breach_penalty_society_min=0.0, breach_penalty_victim=0.0, breach_move_max_product=True, initial_wallet_balances=None, money_resolution=0.5, default_signing_delay=0, transportation_delay=0, transfer_delay=0, start_negotiations_immediately=False, catalog_profit=0.15, avg_process_cost_is_public=True, catalog_prices_are_public=True, strip_annotations=True, financial_reports_period=10, ignore_negotiated_penalties=False, prevent_cfp_tampering=False, default_price_for_products_without_one=1, compensation_fraction=0.5, compact=False, log_folder=None, log_to_file=True, log_to_screen=False, log_file_level=10, log_screen_level=40, log_file_name='log.txt', log_ufuns=False, log_negotiations=False, save_mechanism_state_in_contract=False, save_signed_contracts=True, save_cancelled_contracts=True, save_negotiations=True, save_resolved_breaches=True, save_unresolved_breaches=True, ignore_agent_exceptions=False, ignore_contract_execution_exceptions=False, name=None, **kwargs)[source]

Bases: negmas.situated.situated.TimeInAgreementMixin, negmas.situated.situated.World

The SCML2020World class running a simulation of supply chain management.

Attributes Summary

winners

The winners of this world (factory managers with maximum wallet balance

Methods Summary

assign_managers([factory_managers, params])

Assigns existing factories to new factory managers created from the given types and parameters or manager objects.

breach_record(breach)

Converts a breach to a record suitable for storage during the simulation

buy_insurance(contract, agent)

Buys insurance for the contract by the premium calculated by the insurance company.

chain_world([n_intermediate_levels, …])

Creates a very small world in which only one raw material and one final product.

complete_contract_execution(contract, …)

The resolution can either be None or a contract with the following items:

contract_record(contract)

Converts a contract to a record suitable for permanent storage

contract_size(contract)

Returns an estimation of the activity level associated with this contract.

evaluate_insurance(contract, agent[, t])

Can be called to evaluate the premium for insuring the given contract against breachs committed by others

execute_action(action, agent[, callback])

Executes the given action by the given agent

get_private_state(agent)

Reads the private state of the given agent

join(x[, simulation_priority])

Add an agent to the world.

make_bankrupt(agent, amount, beneficiary, …)

Marks the agent as bankrupt

nullify_contract(contract)

on_event(event, sender)

Called whenever an event is raised for which the SCML2020World is registered asa listener

order_contracts_for_execution(contracts)

Orders the contracts in a specific time-step that are about to be executed

post_step_stats()

Saves relevant stats

pre_step_stats()

Called at the beginning of the simulation step to prepare stats or update them

random([n_raw_materials, …])

Creates a random SCML scenario with adjustable parameters.

random_small([n_production_levels, …])

receive_financial_reports(agent, receive, agents)

Registers interest/disinterest in receiving financial reports

register_interest(agent, products)

rtype

None

request_negotiation_about(req_id, caller, …)

Requests to start a negotiation with some other agents

run_negotiation(caller, issues, partners, …)

Runs a negotiation until completion

run_negotiations(caller, issues, partners, …)

Requests to run a set of negotiations simultaneously.

save_config(file_name)

Saves the config of the world as a yaml file

set_consumers(consumers)

set_factory_managers(factory_managers)

set_miners(miners)

set_processes(processes)

set_products(products)

simulation_step(stage)

A step of SCML simulation

start_contract_execution(contract)

Tries to execute the contract

unregister_interest(agent, products)

rtype

None

Attributes Documentation

winners

The winners of this world (factory managers with maximum wallet balance

Methods Documentation

assign_managers(factory_managers=typing.Iterable[typing.Union[str, typing.Type[scml.scml2019.factory_managers.builtins.FactoryManager], scml.scml2019.factory_managers.builtins.FactoryManager]], params=None)[source]

Assigns existing factories to new factory managers created from the given types and parameters or manager objects.

Parameters

Remarks:

  • factories are assigned in the same order they exist in the local factories attribute cycling through the input managers or types/params

  • If a FactoryManager object is given instead of a type or a string in the factory_managers collection, and the number of factory_managers is less than the number of factories in the world causing this object to cycle for more than one factory, it is assigned to the first such factory but then deep copies of it with new ids and names are assigned to the rest of the factories. That ensures that each manager has exactly one factory and that all factories are assigned exactly one unique manager.

Return type

None

breach_record(breach)[source]

Converts a breach to a record suitable for storage during the simulation

Return type

Dict[str, Any]

buy_insurance(contract, agent)[source]

Buys insurance for the contract by the premium calculated by the insurance company.

Remarks:

The agent can call evaluate_insurance to find the premium that will be used.

Return type

bool

classmethod chain_world(n_intermediate_levels=0, n_miners=5, n_factories_per_level=5, n_consumers=5, n_steps=100, n_lines_per_factory=10, n_max_assignable_factories=None, log_file_name=None, agent_names_reveal_type=False, negotiator_type='negmas.sao.AspirationNegotiator', miner_type=<class 'scml.scml2019.miners.ReactiveMiner'>, consumer_type=<class 'scml.scml2019.consumers.JustInTimeConsumer'>, max_storage=9223372036854775807, default_manager_params=None, miner_kwargs=None, consumption=(0, 5), consumer_kwargs=None, negotiation_speed=21, manager_types=(<class 'scml.scml2019.factory_managers.builtins.GreedyFactoryManager'>, ), manager_params=None, n_default_per_level=0, default_factory_manager_type=<class 'scml.scml2019.factory_managers.builtins.GreedyFactoryManager'>, randomize=True, initial_wallet_balances=1000, process_cost=(1.0, 5.0), process_time=1, interest_rate=inf, interest_max=inf, shared_profile_per_factory=False, **kwargs)[source]

Creates a very small world in which only one raw material and one final product. The production graph is a series with n_intermediate_levels intermediate levels between the single raw material and single final product

Parameters
  • n_max_assignable_factories – The maximum number of factories assigned to managers other than the default

  • randomize (bool) – If true, the factory assignment is randomized

  • n_default_per_level (int) – The number of GreedyFactoryManager objects guaranteed at every level

  • default_factory_manager_type (Type[FactoryManager]) – The FactoryManager type to use as the base for default_factory_managers. You can specify how many of this type exist at every level by specifying n_default_per_level. If n_default_per_level is zero, this parameter has no effect.

  • manager_types (Sequence[Type[FactoryManager]]) – A sequence of factory manager types to control the factories.

  • manager_params (Optional[Sequence[Dict[str, Any]]]) – An optional sequence of dictionaries giving the parameters to pass to manager_types.

  • consumer_type (Union[str, Type[Consumer]]) – Consumer type to use for all consumers

  • miner_type (Union[str, Type[Miner]]) – Miner type to use for all miners

  • consumption (Union[int, Tuple[int, int]]) – Consumption schedule

  • n_intermediate_levels – The number of intermediate products

  • n_miners – number of miners of the single raw material

  • n_factories_per_level – number of factories at every production level

  • n_consumers (Union[int, Tuple[int, int], List[int]]) – number of consumers of the final product

  • n_steps – number of simulation steps

  • n_lines_per_factory – number of lines in each factory

  • process_cost (Union[float, Tuple[float, float]]) – The range of process costs. A uniform distribution will be used

  • process_time (Union[int, Tuple[int, int]]) – The range of process times. A uniform distribution will be used

  • log_file_name (Optional[str]) – File name to store the logs

  • agent_names_reveal_type (bool) – If true, agent names will start with a snake_case version of their type name

  • negotiator_type (str) – The negotiation factory used to create all negotiators

  • max_storage (int) – maximum storage capacity for all factory managers If None then it is unlimited

  • default_manager_params (Optional[Dict[str, Any]]) – keyword arguments to be used for constructing factory managers

  • consumer_kwargs (Optional[Dict[str, Any]]) – keyword arguments to be used for constructing consumers

  • miner_kwargs (Optional[Dict[str, Any]]) – keyword arguments to be used for constructing miners

  • negotiation_speed (Optional[int]) – The number of negotiation steps per simulation step. None means infinite

  • interest_max – Maximum interest rate

  • interest_rate – Minimum interest rate

  • initial_wallet_balances – initial wallet balances for all factories

  • shared_profile_per_factory – If true, all lines in the same factory will have the same profile costs

  • kwargs – Any other parameters are just passed to the world constructor

Returns

SCML2019World ready to run

Remarks:

  • Every production level n has one process only that takes n steps to complete

complete_contract_execution(contract, breaches, resolution)[source]

The resolution can either be None or a contract with the following items:

The issues can be any or all of the following:

immediate_quantity: int immediate_unit_price: float later_quantity: int later_unit_price: int later_penalty: float later_time: int

contract_record(contract)[source]

Converts a contract to a record suitable for permanent storage

Return type

Dict[str, Any]

contract_size(contract)[source]

Returns an estimation of the activity level associated with this contract. Higher is better :type contract: Contract :param contract:

Returns:

Return type

float

evaluate_insurance(contract, agent, t=None)[source]

Can be called to evaluate the premium for insuring the given contract against breachs committed by others

Parameters
  • agent (SCML2019Agent) – The agent buying the contract

  • contract (Contract) – hypothetical contract

  • t (Optional[int]) – time at which the policy is to be bought. If None, it means current step

Return type

Optional[float]

execute_action(action, agent, callback=None)[source]

Executes the given action by the given agent

Return type

bool

get_private_state(agent)[source]

Reads the private state of the given agent

Return type

FactoryState

join(x, simulation_priority=0)[source]

Add an agent to the world.

Parameters
  • x (Agent) – The agent to be registered

  • simulation_priority (int) – The simulation priority. Entities with lower priorities will be stepped first during

Returns:

make_bankrupt(agent, amount, beneficiary, contract)[source]

Marks the agent as bankrupt

Return type

None

nullify_contract(contract)[source]
on_event(event, sender)[source]

Called whenever an event is raised for which the SCML2020World is registered asa listener

Parameters
  • event (Event) – The event

  • sender (EventSource) – The sender

Return type

None

Returns

None

order_contracts_for_execution(contracts)[source]

Orders the contracts in a specific time-step that are about to be executed

post_step_stats()[source]

Saves relevant stats

pre_step_stats()[source]

Called at the beginning of the simulation step to prepare stats or update them

Kept for backward compatibility and will be dropped. Override update_stats instead

classmethod random(n_raw_materials=(5, 10), raw_material_price=(1.0, 30.0), n_final_products=(3, 5), n_production_levels=(3, 5), n_products_per_level=(3, 5), n_processes_per_level=(6, 10), n_inputs_per_process=(2, 5), bias_toward_last_level_products=0.0, quantity_per_input=(1, 10), input_step=0.0, quantity_per_output=(1, 1), output_step=1.0, process_relative_cost=(0.05, 0.4), n_outputs_per_process=(1, 1), n_lines=(3, 5), lines_are_similar=False, n_processes_per_line=None, cost_for_line=(5.0, 50.0), n_production_steps=(2, 10), max_storage=2000, n_factories=20, n_consumers=5, n_products_per_consumer=None, n_miners=5, n_products_per_miner=None, factory_manager_types=<class 'scml.scml2019.factory_managers.builtins.GreedyFactoryManager'>, consumer_types=<class 'scml.scml2019.consumers.JustInTimeConsumer'>, miner_types=<class 'scml.scml2019.miners.ReactiveMiner'>, negotiator_type='negmas.sao.AspirationNegotiator', initial_wallet_balance=1000, factory_kwargs=None, miner_kwargs=None, consumer_kwargs=None, **kwargs)[source]

Creates a random SCML scenario with adjustable parameters.

Parameters
  • n_raw_materials (Union[int, Tuple[int, int]]) – Number of raw materials. Can be a value or a range.

  • raw_material_price (Union[float, Tuple[float, float]]) – Catalog prices for raw materials. Can be a value or a range.

  • n_final_products (Union[int, Tuple[int, int]]) – Number of final products. Can be a value or a range.

  • n_production_levels (Union[int, Tuple[int, int]]) – How deep is the production graph (number of intermediate products). Can be a value or

  • range. (a) –

  • n_products_per_level (Union[int, Tuple[int, int]]) – How many intermediate products per intermediate level. Can be a value or a range.

  • n_processes_per_level (Union[int, Tuple[int, int]]) – Number of processes in intermediate levels. Can be a value or a range.

  • n_inputs_per_process (Union[int, Tuple[int, int]]) – Number of inputs per process. Can be a value or a range.

  • bias_toward_last_level_products (float) – How biased are production processes toward using products from the last

  • below them (level) –

  • quantity_per_input (Union[int, Tuple[int, int]]) – How many items are needed for each input to a process. Can be a value or a range.

  • input_step (Union[float, Tuple[float, float]]) – When are inputs consumed during the production process. Can be a value or a range. Default 0

  • quantity_per_output (Union[int, Tuple[int, int]]) – How many items are produced per output. Can be a value or a range.

  • output_step (Union[float, Tuple[float, float]]) – When are outputs created during the production process. Can be a value or a range. Default 1

  • process_relative_cost (Union[float, Tuple[float, float]]) – Intrinsic relative cost of processes [Outputs will be produced

  • a cost of sum (at) –

  • n_outputs_per_process (Union[int, Tuple[int, int]]) – Number of outputs per process. Can be a value or a range.

  • n_lines (Union[int, Tuple[int, int]]) – Number of lines per factory. Can be a value or a range.

  • lines_are_similar (bool) – If true then all lins of the same factory will have the same production processes.

  • n_processes_per_line (Union[Tuple[int, int], int, None]) – Number of processes that can be run on each line per factory. Can be a value or a

  • range.

  • cost_for_line (Union[float, Tuple[float, float]]) – Cost for running a process on a line. Can be a value or a range.

  • n_production_steps (Union[int, Tuple[int, int]]) – Number of production steps per line. Can be a value or a range.

  • max_storage (Union[int, Tuple[int, int]]) – Maximum storage per factory. Can be a value or a range.

  • n_factories (Union[int, Tuple[int, int]]) – Number of factories. Can be a value or a range.

  • n_consumers (Union[int, Tuple[int, int]]) – Number of consumers. Can be a value or a range.

  • n_products_per_consumer (Union[Tuple[int, int], int, None]) – Number of products per miner. If None then all final products will be assigned to

  • customer. Can be a value or a range. (every) –

  • n_miners (Union[int, Tuple[int, int]]) – Number of miners. Can be a value or a range.

  • n_products_per_miner (Union[Tuple[int, int], int, None]) – Number of products per miner. If None then all raw materials will be assigned to every

  • Can be a value or a range. (miner.) –

  • factory_manager_types (Union[Type[FactoryManager], List[Type[FactoryManager]]]) – A callable for creating factory managers for the factories

  • consumer_types (Union[Type[Consumer], List[Type[Consumer]]]) – A callable for creating Consumer objects

  • miner_types (Union[Type[Miner], List[Type[Miner]]]) – A callable for creating Miner objects

  • negotiator_type – A string that can be `eval`uated to a negotiator.

  • initial_wallet_balance (Union[float, Tuple[float, float]]) – The initial balance of all wallets

  • factory_kwargs (Optional[Dict[str, Any]]) – keyword arguments to be used for constructing factory managers

  • consumer_kwargs (Optional[Dict[str, Any]]) – keyword arguments to be used for constructing consumers

  • miner_kwargs (Optional[Dict[str, Any]]) – keyword arguments to be used for constructing miners

  • **kwargs

Returns

SCML2019World The random world generated

Remarks:

  • Most parameters accept either a single value or a 2-valued tuple. In the later case, it will sample a value within the range specified by the tuple (low, high) inclusive. For example the number of lines (n_lines) follows this pattern

classmethod random_small(n_production_levels=1, n_factories=10, factory_kwargs=None, miner_kwargs=None, consumer_kwargs=None, **kwargs)[source]
receive_financial_reports(agent, receive, agents)[source]

Registers interest/disinterest in receiving financial reports

register_interest(agent, products)[source]
Return type

None

request_negotiation_about(req_id, caller, issues, partners, roles=None, annotation=None, mechanism_name=None, mechanism_params=None, group=None)[source]

Requests to start a negotiation with some other agents

Parameters
  • req_id (str) – An ID For the request that is unique to the caller

  • caller (Agent) – The agent requesting the negotiation

  • partners (List[Agent]) – A list of partners to participate in the negotiation. Note that the caller itself may not be in this list which makes it possible for an agent to request a negotaition that it does not participate in. If that is not to be allowed in some world, override this method and explicitly check for these kinds of negotiations and return False. If partners is passed as a single string/Agent or as a list containing a single string/Agent, then he caller will be added at the beginning of the list. This will only be done if roles was passed as None.

  • issues (List[Issue]) – Negotiation issues

  • annotation (Optional[Dict[str, Any]]) – Extra information to be passed to the partners when asking them to join the negotiation

  • partners – A list of partners to participate in the negotiation

  • roles (Optional[List[str]]) – The roles of different partners. If None then each role for each partner will be None

  • mechanism_name (Optional[str]) – Name of the mechanism to use. It must be one of the mechanism_names that are supported by the

  • or None which means that the World should select the mechanism. If None, then roles and my_role (World) –

  • also be None (must) –

  • mechanism_params (Optional[Dict[str, Any]]) – A dict of parameters used to initialize the mechanism object

  • group – An identifier for the group to which the negotiation belongs. This is not not used by the system.

Returns

None. The caller will be informed by a callback function on_neg_request_accepted or on_neg_request_rejected about the status of the negotiation.

run_negotiation(caller, issues, partners, negotiator, ufun=None, caller_role=None, roles=None, annotation=None, mechanism_name=None, mechanism_params=None)[source]

Runs a negotiation until completion

Parameters
  • caller (Agent) – The agent requesting the negotiation

  • partners (Collection[Agent]) – A list of partners to participate in the negotiation. Note that the caller itself may not be in this list which makes it possible for an agent to request a negotaition that it does not participate in. If that is not to be allowed in some world, override this method and explicitly check for these kinds of negotiations and return False. If partners is passed as a single string/Agent or as a list containing a single string/Agent, then he caller will be added at the beginning of the list. This will only be done if roles was passed as None.

  • negotiator (Negotiator) – The negotiator to be used in the negotiation

  • ufun (Optional[UtilityFunction]) – The utility function. Only needed if the negotiator does not already know it

  • caller_role (Optional[str]) – The role of the caller in the negotiation

  • issues (Collection[Issue]) – Negotiation issues

  • annotation (Optional[Dict[str, Any]]) – Extra information to be passed to the partners when asking them to join the negotiation

  • partners – A list of partners to participate in the negotiation

  • roles (Optional[Collection[str]]) – The roles of different partners. If None then each role for each partner will be None

  • mechanism_name (Optional[str]) – Name of the mechanism to use. It must be one of the mechanism_names that are supported by the

  • or None which means that the World should select the mechanism. If None, then roles and my_role (World) –

  • also be None (must) –

  • mechanism_params (Optional[Dict[str, Any]]) – A dict of parameters used to initialize the mechanism object

Return type

Optional[Tuple[Contract, AgentMechanismInterface]]

Returns

A Tuple of a contract and the ami of the mechanism used to get it in case of success. None otherwise

run_negotiations(caller, issues, partners, negotiators, ufuns=None, caller_roles=None, roles=None, annotations=None, mechanism_names=None, mechanism_params=None, all_or_none=False)[source]

Requests to run a set of negotiations simultaneously. Returns after all negotiations are run to completion

Parameters
  • caller (Agent) – The agent requesting the negotiation

  • partners (List[List[Agent]]) – A list of list of partners to participate in the negotiation. Note that the caller itself may not be in this list which makes it possible for an agent to request a negotaition that it does not participate in. If that is not to be allowed in some world, override this method and explicitly check for these kinds of negotiations and return False. If partners[i] is passed as a single string/Agent or as a list containing a single string/Agent, then he caller will be added at the beginning of the list. This will only be done if roles was passed as None.

  • issues (Union[List[Issue], List[List[Issue]]]) – Negotiation issues

  • negotiators (List[Negotiator]) – The negotiator to be used in the negotiation

  • ufuns (Optional[List[UtilityFunction]]) – The utility function. Only needed if the negotiator does not already know it

  • caller_roles (Optional[List[str]]) – The role of the caller in the negotiation

  • annotations (Optional[List[Optional[Dict[str, Any]]]]) – Extra information to be passed to the partners when asking them to join the negotiation

  • partners – A list of partners to participate in the negotiation

  • roles (Optional[List[Optional[List[str]]]]) – The roles of different partners. If None then each role for each partner will be None

  • mechanism_names (Union[str, List[str], None]) – Name of the mechanism to use. It must be one of the mechanism_names that are supported by the

  • or None which means that the World should select the mechanism. If None, then roles and my_role (World) –

  • also be None (must) –

  • mechanism_params (Union[Dict[str, Any], List[Dict[str, Any]], None]) – A dict of parameters used to initialize the mechanism object

  • all_of_none – If True, ALL partners must agree to negotiate to go through.

Returns

contract (None for failure) and ami (The mechanism info [None if the partner refused the negotiation])

Return type

A list of tuples each with two values

save_config(file_name)[source]

Saves the config of the world as a yaml file

Parameters

file_name (str) – Name of file to save the config to

Returns:

Return type

None

set_consumers(consumers)[source]
set_factory_managers(factory_managers)[source]
set_miners(miners)[source]
set_processes(processes)[source]
set_products(products)[source]
simulation_step(stage)[source]

A step of SCML simulation

start_contract_execution(contract)[source]

Tries to execute the contract

Parameters

contract (Contract) –

Returns

The set of breaches committed if any. If there are no breaches return an empty set

Return type

Set[Breach]

Remarks:

  • You must call super() implementation of this method before doing anything

  • It is possible to return None which indicates that the contract was nullified (i.e. not executed due to a reason other than an execution exeception).

unregister_interest(agent, products)[source]
Return type

None