1use neura_graph::{Graph, Shape, Value};
2
3pub fn rms(graph: &Graph, value: Value, weight: Value, floor: Value) -> Value {
4 let squares = graph.mul(value, value);
5 let mean = graph.mean_axis(squares, 3);
6 let scale = graph.recip(graph.sqrt(graph.add(mean, floor)));
7 graph.mul(graph.mul(value, scale), weight)
8}
9
10pub fn l2(graph: &Graph, value: Value, floor: Value) -> Value {
11 let squares = graph.mul(value, value);
12 let total = graph.sum_axis(squares, 3);
13 let scale = graph.recip(graph.sqrt(graph.add(total, floor)));
14 graph.mul(value, scale)
15}
16
17pub fn softplus(graph: &Graph, value: Value) -> Value {
18 let threshold = graph.fill(Shape::scalar(), 20.0);
19 let raised = graph.log(graph.add(graph.fill(Shape::scalar(), 1.0), graph.exp(value)));
20 graph.select(graph.greater(value, threshold), value, raised)
21}
22
23pub fn flatten(graph: &Graph, value: Value) -> Value {
24 let elements = graph.shape(value).elements();
25 graph.reshape(value, Shape::of([1, 1, 1, elements]))
26}