File size: 2,545 Bytes
c1d0c23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
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
57
58
59
60
61
62
63
64
from typing import List, Dict, Any
import random
from tinytroupe.social_network import NetworkTopology
from tinytroupe.agent import TinyPerson

class NetworkGenerator:
    def __init__(self, personas: List[TinyPerson]):
        self.personas = personas

    def generate_scale_free_network(self, n: int, m: int) -> NetworkTopology:
        """Barabási-Albert model"""
        network = NetworkTopology()
        for p in self.personas:
            network.add_persona(p)

        # Simplified BA model
        # For each new node, connect it to m existing nodes with probability proportional to their degree
        # For now, a very simple version
        persona_names = [p.name for p in self.personas]
        for i, name in enumerate(persona_names):
            if i == 0: continue
            # Connect to some random previous nodes
            targets = random.sample(persona_names[:i], min(i, m))
            for target in targets:
                network.add_connection(name, target, strength=random.random())

        return network

    def generate_small_world_network(self, n: int, k: int, p: float) -> NetworkTopology:
        """Watts-Strogatz model"""
        network = NetworkTopology()
        for persona in self.personas:
            network.add_persona(persona)

        # Simplified WS model
        persona_names = [p.name for p in self.personas]
        num_nodes = len(persona_names)
        for i in range(num_nodes):
            for j in range(1, k // 2 + 1):
                target = persona_names[(i + j) % num_nodes]
                network.add_connection(persona_names[i], target, strength=random.random())

        # Rewiring...
        return network

    def generate_community_network(self, num_communities: int, community_sizes: List[int]) -> NetworkTopology:
        network = NetworkTopology()
        # ...
        return network

    def generate_professional_network(self, personas: List[TinyPerson]) -> NetworkTopology:
        """LinkedIn-style network based on industry, company, role"""
        network = NetworkTopology()
        for p in personas:
            network.add_persona(p)

        for i, p1 in enumerate(personas):
            for p2 in personas[i+1:]:
                # Connect if same industry or similar roles
                if p1._persona.get("occupation") == p2._persona.get("occupation"):
                    if random.random() < 0.3:
                        network.add_connection(p1.name, p2.name, strength=random.random(), relationship_type="colleague")
        return network