Loading...
Searching...
No Matches
operator.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 Artificial Intelligence Techniques, S.L. and Roberto López González
3
4#pragma once
5
11
12namespace opennn
13{
14
15class Json;
16class JsonWriter;
17
18inline bool link_views(span<const TensorView> views, initializer_list<TensorView*> targets)
19{
20 if (views.size() < targets.size()) return false;
21
22 size_t index = 0;
23 for (TensorView* target : targets) *target = views[index++];
24 return true;
25}
26
28{
29 virtual ~Operator() = default;
30
31 virtual vector<TensorSpec> parameter_specs() const { return {}; }
32 virtual vector<TensorSpec> state_specs() const { return {}; }
33
34 struct SlotQuantization { Index channels = 0; int axis = 0; };
35 virtual vector<SlotQuantization> parameter_quantization() const { return {}; }
36
37 // One trainable tensor and the gradient that shadows it, in the order the
38 // layout hands the views over. An operator that declares its slots here
39 // gets both link_parameters and link_gradients from the base. The two used
40 // to be written as a matched pair per operator, each restating the same
41 // use_bias / RMS / positional condition, so the pair could drift.
43 {
45 TensorView* gradient = nullptr;
46
47 // Whether the layout supplies this slot at all. An absent slot is
48 // reset so a projection that drops its bias, or an RMS norm that has
49 // no beta, cannot keep a stale view. The exception is a view another
50 // link step owns: the embedding's positional table is a state when it
51 // is not a trained parameter, and link_states has already filled it.
52 bool present = true;
53 bool retain_when_absent = false;
54 };
55
56 virtual vector<ParameterSlot> parameter_slots() { return {}; }
57
58 virtual void link_parameters(span<const TensorView> views) { link_slots(views, &ParameterSlot::parameter); }
59 virtual void link_gradients (span<const TensorView> views) { link_slots(views, &ParameterSlot::gradient); }
60 virtual void link_states (span<const TensorView>) {}
61 virtual void link_parameter_scales(span<const TensorView>) {}
62
63 // Returns whether the layout supplied a view for every present slot, which
64 // is what the old link_views reported and what two operators still act on.
65 bool link_slots(span<const TensorView> views, TensorView* ParameterSlot::* member)
66 {
67 const vector<ParameterSlot> slots = parameter_slots();
68
69 size_t needed = 0;
70 for (const ParameterSlot& slot : slots) needed += slot.present ? 1 : 0;
71 if (views.size() < needed) return false;
72
73 size_t index = 0;
74 for (const ParameterSlot& slot : slots)
75 {
76 TensorView* const target = slot.*member;
77 if (slot.present) *target = views[index++];
78 else if (!slot.retain_when_absent) *target = {};
79 }
80
81 return true;
82 }
83
84 virtual void initialize_states() {}
85
86 virtual void set_weights_dtype(Type new_weights_dtype) { weights_dtype = new_weights_dtype; }
87
88 virtual void set_parameters_random() {}
89 virtual void set_parameters_glorot() {}
90
92
94 virtual void back_propagate(ForwardPropagation&, BackPropagation&, size_t) const {}
95
96 virtual void to_JSON (JsonWriter&) const {}
97 virtual void from_JSON(const Json*) {}
98 virtual void load_state_from_JSON(const Json*) {}
99
102
103 vector<size_t> input_slots = {0};
104 vector<size_t> output_slots = {1};
105
106 vector<size_t> input_delta_slots = {1};
107 vector<size_t> output_delta_slots = {0};
108
109 TensorView& get_input(ForwardPropagation& forward_propagation, size_t layer, size_t slot_index = 0) const noexcept
110 {
111 const size_t slot = input_slots[slot_index];
112 return slot == 0 ? forward_propagation.inputs[layer][0] : forward_propagation.slots[layer][slot];
113 }
114
115 vector<TensorView>& get_inputs(ForwardPropagation& forward_propagation, size_t layer) const noexcept
116 {
117 return forward_propagation.inputs[layer];
118 }
119
120 TensorView& get_output(ForwardPropagation& forward_propagation, size_t layer, size_t slot_index = 0) const noexcept
121 {
122 return forward_propagation.slots[layer][output_slots[slot_index]];
123 }
124
125 TensorView& get_output_delta(BackPropagation& back_propagation, size_t layer, size_t slot_index = 0) const noexcept
126 {
127 const size_t slot = output_delta_slots[slot_index];
128 return slot == 0 ? back_propagation.output_deltas[layer] : back_propagation.slots[layer][slot];
129 }
130
131 TensorView& get_input_delta(BackPropagation& back_propagation, size_t layer, size_t slot_index = 0) const noexcept
132 {
133 return back_propagation.slots[layer][input_delta_slots[slot_index]];
134 }
135};
136
137}
Definition json.h:92
Definition json.h:24
Definition configuration.h:10
bool link_views(span< const TensorView > views, initializer_list< TensorView * > targets)
Definition operator.h:18
Type
Definition configuration.h:13
@ FP32
Definition configuration.h:13
ForwardPropagationMode
Definition forward_propagation.h:33
Definition back_propagation.h:19
vector< TensorView > output_deltas
Definition back_propagation.h:75
vector< vector< TensorView > > slots
Definition back_propagation.h:76
Definition forward_propagation.h:52
vector< vector< TensorView > > inputs
Definition forward_propagation.h:136
vector< vector< TensorView > > slots
Definition forward_propagation.h:137
Definition operator.h:43
TensorView * gradient
Definition operator.h:45
bool present
Definition operator.h:52
bool retain_when_absent
Definition operator.h:53
TensorView * parameter
Definition operator.h:44
Definition operator.h:34
Index channels
Definition operator.h:34
int axis
Definition operator.h:34
Definition operator.h:28
virtual void link_gradients(span< const TensorView > views)
Definition operator.h:59
TensorView & get_input(ForwardPropagation &forward_propagation, size_t layer, size_t slot_index=0) const noexcept
Definition operator.h:109
virtual void link_parameters(span< const TensorView > views)
Definition operator.h:58
virtual void set_weights_dtype(Type new_weights_dtype)
Definition operator.h:86
vector< TensorView > & get_inputs(ForwardPropagation &forward_propagation, size_t layer) const noexcept
Definition operator.h:115
virtual vector< TensorSpec > parameter_specs() const
Definition operator.h:31
Type compute_dtype
Definition operator.h:100
TensorView & get_input_delta(BackPropagation &back_propagation, size_t layer, size_t slot_index=0) const noexcept
Definition operator.h:131
Type weights_dtype
Definition operator.h:101
virtual vector< ParameterSlot > parameter_slots()
Definition operator.h:56
bool link_slots(span< const TensorView > views, TensorView *ParameterSlot::*member)
Definition operator.h:65
virtual void from_JSON(const Json *)
Definition operator.h:97
TensorView & get_output_delta(BackPropagation &back_propagation, size_t layer, size_t slot_index=0) const noexcept
Definition operator.h:125
virtual void forward_propagate(ForwardPropagation &, size_t, ForwardPropagationMode)
Definition operator.h:93
virtual void set_parameters_pytorch()
Definition operator.h:91
virtual void to_JSON(JsonWriter &) const
Definition operator.h:96
virtual void load_state_from_JSON(const Json *)
Definition operator.h:98
virtual void initialize_states()
Definition operator.h:84
vector< size_t > output_slots
Definition operator.h:104
vector< size_t > output_delta_slots
Definition operator.h:107
vector< size_t > input_delta_slots
Definition operator.h:106
TensorView & get_output(ForwardPropagation &forward_propagation, size_t layer, size_t slot_index=0) const noexcept
Definition operator.h:120
virtual void link_states(span< const TensorView >)
Definition operator.h:60
virtual vector< SlotQuantization > parameter_quantization() const
Definition operator.h:35
virtual void back_propagate(ForwardPropagation &, BackPropagation &, size_t) const
Definition operator.h:94
virtual void set_parameters_glorot()
Definition operator.h:89
virtual ~Operator()=default
vector< size_t > input_slots
Definition operator.h:103
virtual void link_parameter_scales(span< const TensorView >)
Definition operator.h:61
virtual void set_parameters_random()
Definition operator.h:88
virtual vector< TensorSpec > state_specs() const
Definition operator.h:32
Definition tensor_types.h:540