Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Gauthier Quesnel
irritator
Commits
d152c2bb
Commit
d152c2bb
authored
Jun 24, 2020
by
Gauthier Quesnel
Browse files
core: add qss2 integrator
parent
2c2caa73
Pipeline
#14778
passed with stage
in 53 seconds
Changes
5
Pipelines
2
Expand all
Show whitespace changes
Inline
Side-by-side
app/gui/gui.hpp
View file @
d152c2bb
...
...
@@ -26,70 +26,6 @@ load_file_dialog(std::filesystem::path& out);
bool
save_file_dialog
(
std
::
filesystem
::
path
&
out
);
static
inline
const
char
*
simulation_status_string
[]
=
{
"success"
,
"running"
,
"uninitialized"
,
"internal_error"
,
};
static
inline
const
char
*
status_string
[]
=
{
"success"
,
"unknown_dynamics"
,
"block_allocator_bad_capacity"
,
"block_allocator_not_enough_memory"
,
"head_allocator_bad_capacity"
,
"head_allocator_not_enough_memory"
,
"simulation_not_enough_model"
,
"simulation_not_enough_memory_message_list_allocator"
,
"simulation_not_enough_memory_input_port_list_allocator"
,
"simulation_not_enough_memory_output_port_list_allocator"
,
"data_array_init_capacity_error"
,
"data_array_not_enough_memory"
,
"data_array_archive_init_capacity_error"
,
"data_array_archive_not_enough_memory"
,
"array_init_capacity_zero"
,
"array_init_capacity_too_big"
,
"array_init_not_enough_memory"
,
"vector_init_capacity_zero"
,
"vector_init_capacity_too_big"
,
"vector_init_not_enough_memory"
,
"dynamics_unknown_id"
,
"dynamics_unknown_port_id"
,
"dynamics_not_enough_memory"
,
"model_connect_output_port_unknown"
,
"model_connect_input_port_unknown"
,
"model_connect_already_exist"
,
"model_connect_bad_dynamics"
,
"model_adder_empty_init_message"
,
"model_adder_bad_init_message"
,
"model_adder_bad_external_message"
,
"model_mult_empty_init_message"
,
"model_mult_bad_init_message"
,
"model_mult_bad_external_message"
,
"model_integrator_internal_error"
,
"model_integrator_output_error"
,
"model_integrator_running_without_x_dot"
,
"model_integrator_ta_with_bad_x_dot"
,
"model_integrator_bad_external_message"
,
"model_quantifier_bad_quantum_parameter"
,
"model_quantifier_bad_archive_length_parameter"
,
"model_quantifier_shifting_value_neg"
,
"model_quantifier_shifting_value_less_1"
,
"model_quantifier_bad_external_message"
,
"model_cross_bad_external_message"
,
"model_time_func_bad_init_message"
,
"model_accumulator_bad_external_message"
,
"gui_not_enough_memory"
,
"io_file_format_error"
,
"io_file_format_model_error"
,
"io_file_format_model_number_error"
,
"io_file_format_model_unknown"
,
"io_file_format_dynamics_unknown"
,
"io_file_format_dynamics_limit_reach"
,
"io_file_format_dynamics_init_error"
};
}
// namespace irt
#endif
app/gui/node-editor.cpp
View file @
d152c2bb
This diff is collapsed.
Click to expand it.
app/gui/node-editor.hpp
View file @
d152c2bb
...
...
@@ -18,6 +18,71 @@
namespace
irt
{
inline
const
char
*
status_string
(
const
status
s
)
noexcept
{
static
const
char
*
str
[]
=
{
"success"
,
"unknown_dynamics"
,
"block_allocator_bad_capacity"
,
"block_allocator_not_enough_memory"
,
"head_allocator_bad_capacity"
,
"head_allocator_not_enough_memory"
,
"simulation_not_enough_model"
,
"simulation_not_enough_memory_message_list_allocator"
,
"simulation_not_enough_memory_input_port_list_allocator"
,
"simulation_not_enough_memory_output_port_list_allocator"
,
"data_array_init_capacity_error"
,
"data_array_not_enough_memory"
,
"data_array_archive_init_capacity_error"
,
"data_array_archive_not_enough_memory"
,
"array_init_capacity_zero"
,
"array_init_capacity_too_big"
,
"array_init_not_enough_memory"
,
"vector_init_capacity_zero"
,
"vector_init_capacity_too_big"
,
"vector_init_not_enough_memory"
,
"dynamics_unknown_id"
,
"dynamics_unknown_port_id"
,
"dynamics_not_enough_memory"
,
"model_connect_output_port_unknown"
,
"model_connect_input_port_unknown"
,
"model_connect_already_exist"
,
"model_connect_bad_dynamics"
,
"model_adder_empty_init_message"
,
"model_adder_bad_init_message"
,
"model_adder_bad_external_message"
,
"model_mult_empty_init_message"
,
"model_mult_bad_init_message"
,
"model_mult_bad_external_message"
,
"model_integrator_dq_error"
,
"model_integrator_X_error"
,
"model_integrator_internal_error"
,
"model_integrator_output_error"
,
"model_integrator_running_without_x_dot"
,
"model_integrator_ta_with_bad_x_dot"
,
"model_integrator_bad_external_message"
,
"model_quantifier_bad_quantum_parameter"
,
"model_quantifier_bad_archive_length_parameter"
,
"model_quantifier_shifting_value_neg"
,
"model_quantifier_shifting_value_less_1"
,
"model_quantifier_bad_external_message"
,
"model_cross_bad_external_message"
,
"model_time_func_bad_init_message"
,
"model_accumulator_bad_external_message"
,
"gui_not_enough_memory"
,
"io_file_format_error"
,
"io_file_format_model_error"
,
"io_file_format_model_number_error"
,
"io_file_format_model_unknown"
,
"io_file_format_dynamics_unknown"
,
"io_file_format_dynamics_limit_reach"
,
"io_file_format_dynamics_init_error"
};
return
str
[
static_cast
<
int
>
(
s
)];
}
template
<
class
C
>
constexpr
int
length
(
const
C
&
c
)
noexcept
...
...
lib/include/irritator/core.hpp
View file @
d152c2bb
This diff is collapsed.
Click to expand it.
lib/include/irritator/io.hpp
View file @
d152c2bb
...
...
@@ -92,78 +92,57 @@ private:
bool
convert
(
const
std
::
string_view
dynamics_name
,
dynamics_type
*
type
)
noexcept
{
if
(
dynamics_name
==
"none"
)
{
*
type
=
dynamics_type
::
none
;
return
true
;
}
if
(
dynamics_name
==
"integrator"
)
{
*
type
=
dynamics_type
::
integrator
;
return
true
;
}
if
(
dynamics_name
==
"quantifier"
)
{
*
type
=
dynamics_type
::
quantifier
;
return
true
;
}
if
(
dynamics_name
==
"adder_2"
)
{
*
type
=
dynamics_type
::
adder_2
;
return
true
;
}
if
(
dynamics_name
==
"adder_3"
)
{
*
type
=
dynamics_type
::
adder_3
;
return
true
;
}
if
(
dynamics_name
==
"adder_4"
)
{
*
type
=
dynamics_type
::
adder_4
;
return
true
;
}
if
(
dynamics_name
==
"mult_2"
)
{
*
type
=
dynamics_type
::
mult_2
;
return
true
;
}
if
(
dynamics_name
==
"mult_3"
)
{
*
type
=
dynamics_type
::
mult_3
;
return
true
;
}
if
(
dynamics_name
==
"mult_4"
)
{
*
type
=
dynamics_type
::
mult_4
;
return
true
;
}
if
(
dynamics_name
==
"counter"
)
{
*
type
=
dynamics_type
::
counter
;
return
true
;
}
if
(
dynamics_name
==
"generator"
)
{
*
type
=
dynamics_type
::
generator
;
return
true
;
}
if
(
dynamics_name
==
"constant"
)
{
*
type
=
dynamics_type
::
constant
;
return
true
;
}
if
(
dynamics_name
==
"cross"
)
{
*
type
=
dynamics_type
::
cross
;
return
true
;
}
if
(
dynamics_name
==
"accumulator_2"
)
{
*
type
=
dynamics_type
::
accumulator_2
;
return
true
;
}
struct
string_to_type
{
constexpr
string_to_type
(
const
std
::
string_view
n
,
const
dynamics_type
t
)
:
name
(
n
)
,
type
(
t
)
{}
if
(
dynamics_name
==
"time_func"
)
{
*
type
=
dynamics_type
::
time_func
;
const
std
::
string_view
name
;
dynamics_type
type
;
};
static
constexpr
string_to_type
table
[]
=
{
{
"accumulator_2"
,
dynamics_type
::
accumulator_2
},
{
"adder_2"
,
dynamics_type
::
adder_2
},
{
"adder_3"
,
dynamics_type
::
adder_3
},
{
"adder_4"
,
dynamics_type
::
adder_4
},
{
"constant"
,
dynamics_type
::
constant
},
{
"counter"
,
dynamics_type
::
counter
},
{
"cross"
,
dynamics_type
::
cross
},
{
"generator"
,
dynamics_type
::
generator
},
{
"integrator"
,
dynamics_type
::
integrator
},
{
"mult_2"
,
dynamics_type
::
mult_2
},
{
"mult_3"
,
dynamics_type
::
mult_3
},
{
"mult_4"
,
dynamics_type
::
mult_4
},
{
"none"
,
dynamics_type
::
none
},
{
"quantifier"
,
dynamics_type
::
quantifier
},
{
"qss1_integrator"
,
dynamics_type
::
qss1_integrator
},
{
"qss2_integrator"
,
dynamics_type
::
qss2_integrator
},
{
"qss2_multiplier"
,
dynamics_type
::
qss2_multiplier
},
{
"qss2_sum_2"
,
dynamics_type
::
qss2_sum_2
},
{
"qss2_sum_3"
,
dynamics_type
::
qss2_sum_3
},
{
"qss2_sum_4"
,
dynamics_type
::
qss2_sum_4
},
{
"qss2_wsum_2"
,
dynamics_type
::
qss2_wsum_2
},
{
"qss2_wsum_3"
,
dynamics_type
::
qss2_wsum_3
},
{
"qss2_wsum_4"
,
dynamics_type
::
qss2_wsum_4
},
{
"time_func"
,
dynamics_type
::
time_func
}
};
static_assert
(
std
::
size
(
table
)
==
static_cast
<
size_t
>
(
dynamics_type
::
accumulator_2
)
+
1
);
const
auto
it
=
std
::
lower_bound
(
std
::
begin
(
table
),
std
::
end
(
table
),
dynamics_name
,
[](
const
string_to_type
&
l
,
const
std
::
string_view
r
)
{
return
l
.
name
<
r
;
});
if
(
it
!=
std
::
end
(
table
)
&&
it
->
name
==
dynamics_name
)
{
*
type
=
it
->
type
;
return
true
;
}
...
...
@@ -207,6 +186,69 @@ private:
return
true
;
}
bool
read
(
qss1_integrator
&
dyn
)
noexcept
{
double
&
x1
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_X
));
double
&
x2
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_dQ
));
return
!!
(
is
>>
x1
>>
x2
);
}
bool
read
(
qss2_integrator
&
dyn
)
noexcept
{
double
&
x1
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_X
));
double
&
x2
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_dQ
));
return
!!
(
is
>>
x1
>>
x2
);
}
bool
read
(
qss2_multiplier
&
/*dyn*/
)
noexcept
{
return
true
;
}
bool
read
(
qss2_sum_2
&
/*dyn*/
)
noexcept
{
return
true
;
}
bool
read
(
qss2_sum_3
&
/*dyn*/
)
noexcept
{
return
true
;
}
bool
read
(
qss2_sum_4
&
/*dyn*/
)
noexcept
{
return
true
;
}
bool
read
(
qss2_wsum_2
&
dyn
)
noexcept
{
double
&
x1
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_input_coeffs
[
0
]));
double
&
x2
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_input_coeffs
[
1
]));
return
!!
(
is
>>
x1
>>
x2
);
}
bool
read
(
qss2_wsum_3
&
dyn
)
noexcept
{
double
&
x1
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_input_coeffs
[
0
]));
double
&
x2
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_input_coeffs
[
1
]));
double
&
x3
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_input_coeffs
[
2
]));
return
!!
(
is
>>
x1
>>
x2
>>
x3
);
}
bool
read
(
qss2_wsum_4
&
dyn
)
noexcept
{
double
&
x1
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_input_coeffs
[
0
]));
double
&
x2
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_input_coeffs
[
1
]));
double
&
x3
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_input_coeffs
[
2
]));
double
&
x4
=
*
(
const_cast
<
double
*>
(
&
dyn
.
default_input_coeffs
[
2
]));
return
!!
(
is
>>
x1
>>
x2
>>
x3
>>
x4
);
}
bool
read
(
integrator
&
dyn
)
noexcept
{
return
!!
(
is
>>
dyn
.
default_current_value
>>
dyn
.
default_reset_value
);
...
...
@@ -394,6 +436,58 @@ private:
os
<<
"none
\n
"
;
}
void
write
(
const
qss1_integrator
&
dyn
)
noexcept
{
os
<<
"qss1_integrator "
<<
dyn
.
default_X
<<
' '
<<
dyn
.
default_dQ
<<
'\n'
;
}
void
write
(
const
qss2_integrator
&
dyn
)
noexcept
{
os
<<
"qss2_integrator "
<<
dyn
.
default_X
<<
' '
<<
dyn
.
default_dQ
<<
'\n'
;
}
void
write
(
const
qss2_multiplier
&
/*dyn*/
)
noexcept
{
os
<<
"qss2_multiplier
\n
"
;
}
void
write
(
const
qss2_sum_2
&
/*dyn*/
)
noexcept
{
os
<<
"qss2_sum_2
\n
"
;
}
void
write
(
const
qss2_sum_3
&
/*dyn*/
)
noexcept
{
os
<<
"qss2_sum_3
\n
"
;
}
void
write
(
const
qss2_sum_4
&
/*dyn*/
)
noexcept
{
os
<<
"qss2_sum_4
\n
"
;
}
void
write
(
const
qss2_wsum_2
&
dyn
)
noexcept
{
os
<<
"qss2_wsum_2 "
<<
dyn
.
default_input_coeffs
[
0
]
<<
' '
<<
dyn
.
default_input_coeffs
[
1
]
<<
'\n'
;
}
void
write
(
const
qss2_wsum_3
&
dyn
)
noexcept
{
os
<<
"qss2_wsum_3 "
<<
dyn
.
default_input_coeffs
[
0
]
<<
' '
<<
dyn
.
default_input_coeffs
[
1
]
<<
' '
<<
dyn
.
default_input_coeffs
[
2
]
<<
'\n'
;
}
void
write
(
const
qss2_wsum_4
&
dyn
)
noexcept
{
os
<<
"qss2_wsum_3 "
<<
dyn
.
default_input_coeffs
[
0
]
<<
' '
<<
dyn
.
default_input_coeffs
[
1
]
<<
' '
<<
dyn
.
default_input_coeffs
[
2
]
<<
' '
<<
dyn
.
default_input_coeffs
[
3
]
<<
'\n'
;
}
void
write
(
const
integrator
&
dyn
)
noexcept
{
os
<<
"integrator "
<<
dyn
.
default_current_value
<<
' '
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment