# Profile¶

The Profile model was introduced in 2017 by Milli et al. [1].

The Profile model assumes that the diffusion process is only apparent; each node decides to adopt or not a given behavior – once known its existence – only on the basis of its own interests.

In this scenario the peer pressure is completely ruled out from the overall model: it is not important how many of its neighbors have adopted a specific behaviour, if the node does not like it, it will not change its interests.

Each node has its own profile describing how many it is likely to accept a behaviour similar to the one that is currently spreading.

The diffusion process starts from a set of nodes that have already adopted a given behaviour S:

• for each of the susceptible nodes’ in the neighborhood of a node u in S an unbalanced coin is flipped, the unbalance given by the personal profile of the susceptible node;
• if a positive result is obtained the susceptible node will adopt the behaviour, thus becoming infected.
• if the blocked status is enabled, after having rejected the adoption with probability blocked a node becomes immune to the infection.
• every iteration adopter_rate percentage of nodes spontaneous became infected to endogenous effects.

## Statuses¶

During the simulation a node can experience the following statuses:

Name Code
Susceptible 0
Infected 1
Blocked -1

## Parameters¶

Name Type Value Type Default Mandatory Description
profile Node float in [0, 1] 0.1 False Node profile
blocked Model float in [0, 1] 0 False Blocked nodes

The initial infection status can be defined via:

• percentage_infected: Model Parameter, float in [0, 1]
• Infected: Status Parameter, set of nodes

The two options are mutually exclusive and the latter takes precedence over the former.

## Methods¶

The following class methods are made available to configure, describe and execute the simulation:

### Configure¶

class ndlib.models.epidemics.ProfileModel.ProfileModel(graph)
Node Parameters to be specified via ModelConfig
Parameters: profile – The node profile. As default a value of 0.1 is assumed for all nodes.
ProfileModel.__init__(graph)

Model Constructor

Parameters: graph – A networkx graph object
ProfileModel.set_initial_status(self, configuration)

Set the initial model configuration

Parameters: configuration – a ndlib.models.ModelConfig.Configuration object
ProfileModel.reset(self)

Reset the simulation setting the actual status to the initial configuration.

### Describe¶

ProfileModel.get_info(self)

Describes the current model parameters (nodes, edges, status)

Returns: a dictionary containing for each parameter class the values specified during model configuration
ProfileModel.get_status_map(self)

Specify the statuses allowed by the model and their numeric code

Returns: a dictionary (status->code)

### Execute Simulation¶

ProfileModel.iteration(self)

Execute a single model iteration

Returns: Iteration_id, Incremental node status (dictionary node->status)
ProfileModel.iteration_bunch(self, bunch_size)

Execute a bunch of model iterations

Parameters: bunch_size – the number of iterations to execute node_status – if the incremental node status has to be returned. a list containing for each iteration a dictionary {“iteration”: iteration_id, “status”: dictionary_node_to_status}

## Example¶

In the code below is shown an example of instantiation and execution of a Profile model simulation on a random graph: we set the initial infected node set to the 10% of the overall population and assign a profile of 0.25 to all the nodes.

import networkx as nx
import ndlib.models.ModelConfig as mc
import ndlib.models.epidemics.ProfileModel as pr

# Network topology
g = nx.erdos_renyi_graph(1000, 0.1)

# Model selection
model = pr.ProfileModel(g)
config = mc.Configuration()