Loading...
Searching...
No Matches
model_expression.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
8
9namespace opennn
10{
11
12class Network;
13class Layer;
14
16{
17public:
18
20
22
23 string build_expression() const;
24
25 void save(const filesystem::path&, ProgrammingLanguage) const;
26
27private:
28
29 const Network* network = nullptr;
30
31 string get_expression_c() const;
32 string get_expression_c_embedded() const;
33 string get_expression_python() const;
34 string get_expression_php() const;
35 string get_expression_javascript() const;
36 string get_expression_csharp() const;
37
38 static string c_string_literal(string_view);
39 static string c_float_literal(float);
40
41 vector<string> get_flat_input_names() const;
42
43 struct ExportNames
44 {
45 vector<string> inputs;
46 vector<string> outputs;
47 vector<string> fixed_inputs;
48 vector<string> fixed_outputs;
49
50 Index inputs_number() const noexcept { return Index(inputs.size()); }
51 Index outputs_number() const noexcept { return Index(outputs.size()); }
52 };
53
54 ExportNames collect_names() const;
55 string build_expression(const vector<string>&, const vector<string>&) const;
56
57 void check_parameters_are_finite() const;
58
59 void emit_c_prelude(ostringstream&, const ExportNames&) const;
60 void emit_c_calculate_outputs(ostringstream&, const string&, const vector<string>&, bool has_softmax, const ExportNames&) const;
61 void emit_c_main(ostringstream&, const ExportNames&) const;
62
63 void emit_php_prelude(ostringstream&, const ExportNames&) const;
64 void emit_php_inputs_setup(ostringstream&, const ExportNames&) const;
65 void emit_php_body(ostringstream&, const vector<string>&, bool has_softmax, const ExportNames&) const;
66 void emit_php_response(ostringstream&, const ExportNames&) const;
67
68 void emit_python_prelude(ostringstream&, const ExportNames&) const;
69 void emit_python_class_header(ostringstream&, const ExportNames&) const;
70 void emit_python_calculate_outputs(ostringstream&, const string&, const vector<string>&, bool has_softmax, const ExportNames&) const;
71 void emit_python_batch_and_main(ostringstream&, const ExportNames&) const;
72
73 void emit_js_prelude(ostringstream&, const ExportNames&) const;
74 void emit_js_inputs_html(ostringstream&, const ExportNames&) const;
75 void emit_js_outputs_html(ostringstream&, bool use_category_select, const ExportNames&) const;
76 void emit_js_runtime(ostringstream&, const string&, const vector<string>&, bool has_softmax, bool use_category_select, const ExportNames&) const;
77
78 void emit_csharp_prelude(ostringstream&, const ExportNames&) const;
79 void emit_csharp_calculate_outputs(ostringstream&, const string&, const vector<string>&, bool has_softmax, const ExportNames&) const;
80 void emit_csharp_main(ostringstream&, const ExportNames&) const;
81
82 static vector<string> split_expression_lines(const string&);
83 static void rename_spaced_var_definitions(vector<string>&);
84 static vector<string> prepare_body_lines(const string&);
85 static vector<string> fix_names(const vector<string>&, const string&);
86 static vector<string> fix_output_names(const string&, const vector<string>&, const ProgrammingLanguage&);
87 static void apply_name_mapping(string&, const vector<string>&, const vector<string>&);
88 static string process_body_line(const string&, const vector<string>&, const vector<string>&);
89 static string replace_reserved_keywords(const string&);
90
91 struct LanguageSyntax
92 {
93 const char* body_indent = "";
94 const char* body_declaration = "";
95 bool declare_first_assignment_only = false;
96 const char* softmax_declaration = "";
97 const char* softmax_counter = "";
98 const char* softmax_zero = "";
99 const char* softmax_exp = "";
100 string softmax_limit;
101 };
102
103 static LanguageSyntax language_syntax(ProgrammingLanguage, Index outputs_number = 0);
104 static void emit_body_lines(ostringstream&, const vector<string>&, const LanguageSyntax&, const function<string(const string&)>&);
105 static void emit_softmax_block(ostringstream&, const LanguageSyntax&);
106
107 struct ActivationBodies
108 {
109 string c;
110 string javascript;
111 string python;
112 string php;
113 string csharp;
114 };
115
116 static void emit_activations(ostringstream&,
117 const string& expression,
118 string ActivationBodies::* body,
119 initializer_list<string_view> always);
120
121 static const vector<pair<ActivationFunction, ActivationBodies>>& activation_table();
122};
123
124}
Definition layer.h:38
ProgrammingLanguage
Definition model_expression.h:19
@ C
Definition model_expression.h:19
@ PHP
Definition model_expression.h:19
@ JavaScript
Definition model_expression.h:19
@ CSharp
Definition model_expression.h:19
@ Python
Definition model_expression.h:19
@ CEmbedded
Definition model_expression.h:19
ModelExpression(const Network *)
void save(const filesystem::path &, ProgrammingLanguage) const
string build_expression() const
Definition network.h:87
Definition configuration.h:10