Skip to content

tna

TNAMixin

Bases: OverrideResolveMixin

Adds the Thrust Network Analysis (TNA) form-finding method to a data class.

Source code in src/torch_structure/mixins/tna.py
 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
class TNAMixin(OverrideResolveMixin):
    """Adds the Thrust Network Analysis (TNA) form-finding method to a data class."""

    def tna(
        self,
        inplace: bool=False,
        coords=None,
        is_support=None,
        load=None,
        edge_index=None,
        q_target=None,
        verbose=False,
    ):
        """
        Applies the Thrust Network Analysis (TNA) to this structure and updates `coords`
        , `force` and `force_density`.

        See [`torch_structure.formfinding.tna`](../formfinding/tna.md).
        """
        # batch = getattr(self, "batch", None) # todo: add batching support

        # Node inputs
        coords = self._resolve_override("coords", coords)
        is_support = self._resolve_override("is_support", is_support)
        load = self._resolve_override("load", load)

        # Edge inputs
        edge_mask = self.directed_mask.view(-1)
        edge_index = self._resolve_override("directed_edge_index", edge_index)
        q_target = self._resolve_override("q_target", q_target, mask=edge_mask)

        # TNA computation
        new_coords, new_directed_force, new_directed_force_density = tna(
            coords,
            is_support,
            load,
            edge_index,
            q_target,
            verbose=verbose,
        )
        new_force = self.edge_attr_to_undirected(new_directed_force, edge_mask)
        new_force_density = self.edge_attr_to_undirected(new_directed_force_density, edge_mask)

        # Update data object
        new_data = self if inplace else self.clone()

        new_data.coords = new_coords
        new_data.force = new_force
        new_data.force_density = new_force_density

        if not inplace:
            return new_data

tna(inplace=False, coords=None, is_support=None, load=None, edge_index=None, q_target=None, verbose=False)

Applies the Thrust Network Analysis (TNA) to this structure and updates coords , force and force_density.

See torch_structure.formfinding.tna.

Source code in src/torch_structure/mixins/tna.py
 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
def tna(
    self,
    inplace: bool=False,
    coords=None,
    is_support=None,
    load=None,
    edge_index=None,
    q_target=None,
    verbose=False,
):
    """
    Applies the Thrust Network Analysis (TNA) to this structure and updates `coords`
    , `force` and `force_density`.

    See [`torch_structure.formfinding.tna`](../formfinding/tna.md).
    """
    # batch = getattr(self, "batch", None) # todo: add batching support

    # Node inputs
    coords = self._resolve_override("coords", coords)
    is_support = self._resolve_override("is_support", is_support)
    load = self._resolve_override("load", load)

    # Edge inputs
    edge_mask = self.directed_mask.view(-1)
    edge_index = self._resolve_override("directed_edge_index", edge_index)
    q_target = self._resolve_override("q_target", q_target, mask=edge_mask)

    # TNA computation
    new_coords, new_directed_force, new_directed_force_density = tna(
        coords,
        is_support,
        load,
        edge_index,
        q_target,
        verbose=verbose,
    )
    new_force = self.edge_attr_to_undirected(new_directed_force, edge_mask)
    new_force_density = self.edge_attr_to_undirected(new_directed_force_density, edge_mask)

    # Update data object
    new_data = self if inplace else self.clone()

    new_data.coords = new_coords
    new_data.force = new_force
    new_data.force_density = new_force_density

    if not inplace:
        return new_data