ariadne-cps / ariadne Goto Github PK
View Code? Open in Web Editor NEWC++ framework for rigorous computation on cyber-physical systems
Home Page: http://www.ariadne-cps.org
License: GNU General Public License v3.0
C++ framework for rigorous computation on cyber-physical systems
Home Page: http://www.ariadne-cps.org
License: GNU General Public License v3.0
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Add termination criterion based on flow-to-section.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Add full support for set-valued functions R^m->P(R^n).
We should be able to have all the documentation online, generated from doxygen. There is a doxygen2md tool that may be usable.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Develop rigorous methods for computing eigenvalues/vectors and diagonalising matrices.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Error messages use ARIADNE_PRETTY_FUNCTION in utilitiy/macros.h to display the function causing the error to help with debugging. (e.g. this identifies a NOT_IMPLEMENTED function.) Could you check this behaviour on macOS and implement it if necessary.
Using the test_crossings_issue in the crossings-issue branch, if we use a step size of 1e-2, we get:
#!c++
[:0] Unexpected error in computing critical time for event comes:
std::runtime_error in /Users/lgeretti/Public/sources/ariadne-all/ariadne/geometry/enclosure.cc:492: : Assertion `time.argument_size()==this->number_of_parameters()' failed.
If on the other hand we use a step size of 1e-3, for example, we get a segfault.
Import the BDD implementation of Paving used in the stable repository, using the thread-safe BDD implementation suggested on #146.
Simplifying enclosures is a critical problem in computing system dynamics, especially for our differential inclusion methods.
For affine enclosures, there are well-known methods of Lohner and Kuhn which are implemented in the now deprecated Zonotope
class, and should be moved to AffineSet
classes.
For polynomial enclosures, the problem is an open research problem, but maybe we could do something using the Chebyshev basis.
Depends on #308.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Remove the default arguments for EventKind in the HybridAutomaton classes.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Provide solver options for outputting certificates of correctness of the results of calculations. These certificates must be easily checkable. The idea is that correctness of the tool then only relies on correctness of the certificate checking, which should be easier to prove.
Originally reported by Luca Geretti (Bitbucket: lgeretti, GitHub: lgeretti)
During evolution, in particular when reconditioning is going to kick in, an
libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: Not implemented:
error is issued at a certain point. Check out the pending branch and try the vanderpol example up to 5.75 seconds.
Originally reported by Luca Geretti (Bitbucket: lgeretti, GitHub: lgeretti)
The implementation of uniform error reconditioning in geometry/enclosure.cc:1032
seems odd to me. I assume that it should work by collecting all the result indices for which a relatively large error is present in the model, then it modifies the models for those dimensions by creating a new parameter that encloses the error (which is then removed).
My doubts:
error_domains
variable is assigned twice with no particular reason.large_error_indices[i]
dimensions.error>MAXIMUM_ERROR
seems redundant to me.Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Add functionality for verifying general LTL formulae. This should include writing LTL formulae, converting to an accepting automaton, and verifying the composite system.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
The current way of handling operators and symbolic expressions is not type-safe and is sensitive to bugs. Need a more type-safe solution.
One possibility would be to use a variant object, but std::variant is not yet available and boost::variant is less powerful and more buggy. A more lightweight alternative would be to use Operator types with restricted Code enumerations.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Currently our Logical classes are templates parametrised by a Paradigm tag, with typedefs to user-level names (Boolean, Sierpinskian, Kleenean). I plan to re-implement so that the user-level names are class names, and make some other changes to the semantics to make the interface slightly cleaner.
Use Boolean, Sierpinskian and Kleenean as top-level class names, with Lower/Upper- modifiers for Kleenean, Negated- for Sierpinskian, and Validated- and Approximate- versions. Here, Kleenean is a completion of Boolean in much the same way as Real is a completion of Rational.
Distinguish Sierpinskian from LowerKleenean. Sierpinskian would be for cases in which there is no possibility for robust falsification (which in our case is essentially for inequality) and LowerKleenean for partial information on a quasidecidable predicate (e.g. testing for positivity of a LowerReal, where positivity of a Real would return Kleenean).
Fix LowerKleenean to be for Verifyable predicates (currently LowerKleenean is for Falsifyable, but this is incorrect, since a verified lower bound of 'true' means the predicate must be true, but a lower bound of 'false' means no information).
Effective logical classes will not be convertible to Validated/Approximate classes, but can only be checked with some given Effort.
Add conjunction/disjunction for Sequences of logical types.
Our SetInterface classes also need Effective and Validated versions. Effective (i.e. exactly specified sets) would have predicates returning (Lower)Kleenean, and Validated sets return their Validated logical versions.
Store the effort_used for a Validated/Approximate logical value, to allow mixed Effective/Validated operations (see above).
Store a cached Validated checked value together with the Effort used with any Effective logical predicate. The advantage of this is fast re-checking of predicates.
Additionally:
9. Consider removing possibly(...)
and definitely(...)
for Approximate
and Naive
logical values, as these always yield true
and false
. (However, the usage is consistent, so may be useful in template code.)
10. Deprecate use of decide(...)
. It currently has two orthogonal uses: check Effective
logical types with minimum Effort
, and select an appropriate case for Validated
(definitely
) and Approximate
(probably
). Maybe rename to something less snappy, like cast_decision
.
11. Consider changing probably
to is_likely
and adding an is_unlikely
. Consider changing these to only apply to Approximate
logical types.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Add support for counterexample-guided abstraction refinement.
Originally reported by Luca Geretti (Bitbucket: lgeretti, GitHub: lgeretti)
It is still not possible to perform an implicit conversion to a logical class from a Bool value, as in
(nonlinear_programming.cc:1383)
#!c++
if(probably(t>0)) {
or
(grid_set.cc:407)
#!c++
pCurrentNode->_isEnabled = theEnabledCells[leaf_counter];
Currently, we rely on explicit conversion of the boolean condition into the proper class. Curiously, this issue appeared only on macOS.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Support switching between modes without reset using Filippov semantics.
Originally reported by Luca Geretti (Bitbucket: lgeretti, GitHub: lgeretti)
When using algebraic expressions for dynamics in a given location, plotting with Axes that include such variables fails due to the variables not being found in the corresponding Space.
See the watertank-compositional example.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Use generic class Paving (or a GridPaving) rather than concrete GridTreeSet in system global analysis.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Split hybrid evolution code into scheduling and execution parts.
The rationale is to put complex logic of deciding how to perform the step (so as to avoid excess splitting, variables and constraints) from the task of rigorously performing the step. Ideally, the correctness of the schedule (notably, which events are active) should be simple to check.
Originally reported by Luca Geretti (Bitbucket: lgeretti, GitHub: lgeretti)
With the laser example present in 5d1257bc of the macos_support branch, there are severe issues when computing crossings. The example is quite trivial, the guard is quadratic and should not be such an issue, since on the stable version of Ariadne this system (or more precisely, the full system which is more complicated) is not a problem at all.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Currently, given a Variable x and an Expression e, writing x=e creates an Assignment object. An alternative syntax is let(x)=e. Since a Variable is also an Expression, if y is also a Variable, then x=y creates an assignment rather than re-assigning Variable. This is a potential source of bugs/confusion.
I propose forcing the let(x)=e (or an alternative set(x)=e) syntax.
Assignment of variables should then either be usual assignment or disallowed; which is preferable?
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Should we use a 'Detail' namespace for implementation details which are needed in top-level header files?
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
The conversion of Expression to Function may hang when some of the constants are zero. This is probably to do with the logic of handling/simplifying special cases.
Originally reported by Luca Geretti (Bitbucket: lgeretti, GitHub: lgeretti)
I feel that there is little clarity when defining and using locations for HybridAutomata and their composition. In particular, using a combination of StringVariable and StringConstant for a location name feels awkward. See examples/watertank-compositional.cc.
I would rather keep something similar to the following:
In other terms, we should not have redundancy both when defining the automaton and when displaying it. In particular, it would also be nice if the displayed composite location name didn't have the location name of any automaton with just one location: this is clearly redundant information, with the only effect of increasing the location name.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Add covers/open sets as well as pavings.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Add functionality to keep track of trajectory splitting and recombine split trajectories.
Originally reported by Luca Geretti (Bitbucket: lgeretti, GitHub: lgeretti)
Cannot construct a Space from an initializer list, like in
#!c++
Variable<Real> x("x"), y("y"), z("z");
Space<Real> spc({x,y,z});
This currently affects test_expression.cc only, which has been temporarily modified to explicitly convert the InitializerList to List.
Originally reported by Pieter Collins (Bitbucket: pietercollins, GitHub: pietercollins)
Change evolution of continuous/hybrid systems to use flow-tube functions instead of Enclosure sets. Change Orbits to track splitting and jumping.
Originally reported by Luca Geretti (Bitbucket: lgeretti, GitHub: lgeretti)
On 'function.cc:37', we have the following warning:
#!c++
/Users/lgeretti/Public/sources/ariadne-all/ariadne/function/function_model.h:474:18: warning: binding reference member '_prototype' to a temporary value [-Wdangling-field]
: _prototype(f.create_zero()) { }
^~~~~~~~~~~~~~~
/Users/lgeretti/Public/sources/ariadne-all/ariadne/function/function_model.h:323:16: note: in instantiation of member function 'Ariadne::FunctionModelBuilder<Ariadne::ValidatedTag, Ariadne::Precision64,
Ariadne::Precision64>::FunctionModelBuilder' requested here
return FunctionModelBuilder<P,PR,PRE>(f); }
^
/Users/lgeretti/Public/sources/ariadne-all/ariadne/function/function.cc:1061:81: note: in instantiation of member function 'Ariadne::factory' requested here
ValidatedVectorFunctionModel f1m(f1p); ValidatedVectorFunctionModel f2m=factory(f1m).create(f2); return join(f1m,f2m);
^
/Users/lgeretti/Public/sources/ariadne-all/ariadne/function/function_model.h:52:42: note: reference member declared here
ScalarFunctionModel<P,PR,PRE> const& _prototype;
^
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.