verifit / mata Goto Github PK
View Code? Open in Web Editor NEWA fast and simple automata library
License: MIT License
A fast and simple automata library
License: MIT License
I have the following code:
Mata::Nfa::Nfa aut1;
Mata::RE2Parser::create_nfa(&aut1, "a*");
Mata::Nfa::Nfa aut2;
Mata::RE2Parser::create_nfa(&aut2, "b*");
Mata::Nfa::Nfa aut3;
Mata::RE2Parser::create_nfa(&aut3, "a*b*");
Mata::Nfa::are_equivalent(Mata::Nfa::concatenate(aut1, aut2), aut3);
The equivalence check on the last line should be true, but it is not. It seems there is a problem in concatenation resulting in this case to the NFA accepting "(a|b)*".
The following code causes an unhandled exception (and I suppose it should not):
Mata::Nfa::Nfa aut;
Mata::RE2Parser::create_nfa(&aut, "(a|b)*");
Mata::Nfa::Nfa aut2;
Mata::RE2Parser::create_nfa(&aut2, "(a|b)*b(a*)b");
Mata::Nfa::are_equivalent(aut, aut2);
Can you please fix it?
mata was chosen as a new name of this library. We need to:
forked from ondrik/libvata2
. It is wanted by @kilohsakul, however I think that @ondrik will need to agree with this. I will contact github support which can remove the note about fork.Current binding is broken, because of the merge of one of the PRs.
Disclaimer: I won't be fixxing any binding in any PR until this issue is solved (in isolate PR).
Currently, I'm waiting for merging of the Data encapsulation, which had working binding, and contains some changes that could lead to some conflict if I started fixing this and also will be handy in fixing the break from #100. Once #101 is merged, I will try to fix it.
I am opening this issue for wider discussion.
Assume the following code:
lhs = Nfa();
lhs.add_trans(0,0,0);
In previous (Ondra's) implementation, this worked without problems: new transition was made, and 0
was added as a state of lhs
.
However, the new implementation raises std::runtime_error: 0 or 0 is not a state
.
Correct code is then:
lhs = Nfa(1);
lhs.add_trans(0,0,0);
or
lhs = Nfa();
lhs.increase_size(1);
lhs.add_trans(0,0,0);
The question I am rising is. Would you prefer:
Seems that macos
build fails nondeterministically. Might be an issue, that they are slowly abandoning the current macos image and want to migrate to `macos121. Usually restarting the job fixes it.
Can someone with MacOS experience investigate and fix this?
See: https://github.com/VeriFIT/mata/actions/runs/3736376314/jobs/6340615433
The core of the problem seems to be:
[ 36%] Performing build step for 'cudd_library'
/Users/runner/work/mata/mata/3rdparty/cudd/build-aux/missing: line 81: aclocal-1.16: command not found
WARNING: 'aclocal-1.16' is missing on your system.
There is an assert failure while mintermizing this AFA:
@AFA-bits
%Initial qQC0_0 & qQC1_0
%Final !qQC0_39 & !qQC0_5 & !qQC1_12 & !qQC0_20 & !qQC1_22 & !qQC0_10 & !qQC1_36 & !qQC0_40 & !qQC1_2 & !qQC1_31 & !qQC0_47 & !qQC1_5 & !qQC1_28 & !qQC0_35 & !qQC1_43 & !qQC0_9 & !qQC1_51 & !qQC1_48 & !qQC0_2 & !qQC1_15 & !qQC0_27 & !qQC0_7 & !qQC1_10 & !qQC0_22 & !qQC1_24 & !qQC0_52 & !qQC0_16 & !qQC1_9 & !qQC0_13 & !qQC1_38 & !qQC1_21 & !qQC0_18 & !qQC1_33 & !qQC0_45 & !qQC1_7 & !qQC0_37 & !qQC1_41 & !qQC0_30 & !qQC1_46 & !qQC0_29 & !qQC1_52 & !qQC0_1 & !qQC1_16 & !qQC0_24 & !qQC0_14 & !qQC0_49 & !qQC1_26 & !qQC0_50 & !qQC0_11 & !qQC1_23 & !qQC1_35 & !qQC0_43 & !qQC1_1 & !qQC1_4 & !qQC1_29 & !qQC1_30 & !qQC0_46 & !qQC0_32 & !qQC1_44 & !qQC1_19 & !qQC1_50 & !qQC1_49 & !qQC0_3 & !qQC1_14 & !qQC0_26 & !qQC0_4 & !qQC1_13 & !qQC0_21 & !qQC0_38 & !qQC1_8 & !qQC1_25 & !qQC0_53 & !qQC0_17 & !qQC1_3 & !qQC1_37 & !qQC0_41 & !qQC1_6 & !qQC0_19 & !qQC1_32 & !qQC0_44 & !qQC0_34 & !qQC1_42 & !qQC0_8 & !qQC0_28 & !qQC0_31 & !qQC1_47 & !qQC1_11 & !qQC0_23 & !qQC0_6 & !qQC1_27 & !qQC0_51 & !qQC0_15 & !qQC0_48 & !qQC1_20 & !qQC0_12 & !qQC1_39 & !qQC1_0 & !qQC1_34 & !qQC0_42 & !qQC0_36 & !qQC1_40 & !qQC1_18 & !qQC0_33 & !qQC1_45 & !qQC0_25 & !qQC1_53 & !qQC0_0 & !qQC1_17
qQC1_34 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_35
qQC0_42 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_43
qQC0_3 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_4
qQC1_40 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_41
qQC0_36 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_37
qQC1_9 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_10
qQC1_10 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_11
qQC1_4 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_5
qQC0_22 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_23
qQC1_3 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_4
qQC0_25 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_26
qQC1_53 !aF
qQC1_17 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_18
qQC1_38 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_39
qQC1_21 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_22
qQC0_13 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_14
qQC1_33 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_34
qQC0_18 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_19
qQC0_45 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_46
qQC0_4 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_5
qQC1_36 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_37
qQC0_40 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_41
qQC0_1 (!aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & aV0 & qQC0_2) | (!aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_1)
qQC0_30 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_31
qQC0_29 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_30
qQC1_46 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_47
qQC0_35 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_36
qQC1_43 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_44
qQC1_1 aF | ((aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | !aV0) & (aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0))) | ((aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | !aV0) & qQC1_1) | ((aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0)) & qQC1_2) | (qQC1_2 & qQC1_1)
qQC0_27 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_28
qQC1_51 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_52
qQC1_48 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_49
qQC1_15 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_16
qQC1_23 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_24
qQC0_11 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_12
qQC1_24 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_25
qQC0_16 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_17
qQC0_52 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_53
qQC0_46 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_47
qQC0_7 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_8
qQC1_30 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_31
qQC1_29 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_30
qQC0_32 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_33
qQC1_44 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_45
qQC1_19 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_20
qQC1_8 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_9
qQC1_41 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_42
qQC0_37 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_38
qQC0_21 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_22
qQC1_13 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_14
qQC0_38 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_39
qQC1_7 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_8
qQC0_24 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_25
qQC1_52 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_53
qQC1_16 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_17
qQC1_2 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_3
qQC0_14 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_15
qQC0_49 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_50
qQC0_50 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_51
qQC0_8 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_9
qQC1_26 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_27
qQC0_19 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_20
qQC0_44 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_45
qQC0_5 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_6
qQC1_32 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_33
qQC0_43 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_44
qQC0_2 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & aV0 & qQC0_3
qQC1_35 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_36
qQC0_28 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_29
qQC1_47 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_48
qQC0_31 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_32
qQC1_11 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_12
qQC1_5 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_6
qQC0_23 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_24
qQC1_50 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_51
qQC1_49 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_50
qQC1_14 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_15
qQC1_0 aF | ((aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0)) & (aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | !aV0)) | ((aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0)) & qQC1_2) | ((aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | !aV0) & qQC1_1) | (qQC1_1 & qQC1_2)
qQC0_26 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_27
qQC0_12 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_13
qQC1_39 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_40
qQC1_20 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_21
qQC0_53 aF
qQC1_25 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_26
qQC0_17 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_18
qQC0_41 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_42
qQC0_0 (!aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_1) | (!aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & aV0 & qQC0_2)
qQC1_37 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_38
qQC1_45 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_46
qQC1_18 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_19
qQC0_33 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_34
qQC1_42 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_43
qQC0_34 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_35
qQC1_12 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_13
qQC0_39 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_40
qQC1_6 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_7
qQC0_20 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_21
qQC1_22 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_23
qQC0_10 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_11
qQC0_51 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_52
qQC0_9 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_10
qQC1_27 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_28
qQC0_15 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_16
qQC0_48 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_49
qQC1_31 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_32
qQC1_28 aF | aV15 | aV14 | aV13 | aV12 | aV11 | aV10 | aV9 | aV8 | aV7 | aV6 | !aV5 | !aV4 | aV3 | aV2 | aV1 | (aV0 & !aV0) | qQC1_29
qQC0_47 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_48
qQC0_6 !aF & !aV15 & !aV14 & !aV13 & !aV12 & !aV11 & !aV10 & !aV9 & !aV8 & !aV7 & !aV6 & aV5 & aV4 & !aV3 & !aV2 & !aV1 & (!aV0 | aV0) & qQC0_7
I run this code:
Mata::Mintermization mintermization;
auto mintermized_input = mintermization.mintermize(Mata::IntermediateAut::parse_from_mf(Mata::Parser::parse_mf(input))[0]);
where input
is the string containing the AFA.
Remove revert function which is redundant.
The current CMake configuration should be modified and updated. Namely, the following should be done:
install
command to easily install Mata on the system,find_package(proj mata*)
(*or libmata
),add_subdirectory
(which will compile the whole Mata with its 3rd party dependencies) and allow linking the whole compiled library with target_link_libraries()
.When using the python binding for RE->NFA translation on the regular expression ((aa)*)*(b)*
I get the following error:
libc++abi: terminating with uncaught exception of type std::out_of_range: 0 or 18446744073709551615 is not a state.
We need to add more tests for parser of regexes. Test the parser on more complex regexes and confirm that the parser gives correct automata.
Furthermore, it would be useful to add tests for the whole pipeline from smtlib to NFA.
We might be able to take inspiration from tests for RE2.
When playing with the python binding providing a translation of REs to automata, I encountered an issue probably with a symbol representation. For instance, I would expect that the RE "\xff" is translated to an automaton accepting a single letter "255". In fact, the translator creates an automaton accepting the word "195.191" (attached). Not really sure, if such a behaviour is indeed desired.
aut3.dot.pdf
The library was so far based on determining number of states by checking size of post which is now implemented by method Delta.post_size()
. Since we changed philosophy what number of states is we need to replace call to that method by Nfa.max_state()
.
Function void uni (Nfa *unionAutomaton, const Nfa &lhs, const Nfa &rhs)
is not working as expected.
I have replicated the issues in the following branch: hotfix-failing-union.
The minimal example does union of automaton accepting string 1
and automaton accepting the string 0
. IMO the result should accept both 1 and 0, however, it does not accept 0
. Printed automaton looks weird as well:
The test case that replicates the issue:
TEST_CASE("Vata2::Nfa::union_norename()") {
Word one{1};
Word zero{0};
Nfa lhs(2);
lhs.add_initial(0);
lhs.add_trans(0, 0, 1);
lhs.add_final(1);
REQUIRE(!is_in_lang(lhs, one));
REQUIRE(is_in_lang(lhs, zero));
Nfa rhs(2);
rhs.add_initial(0);
rhs.add_trans(0, 1, 1);
rhs.add_final(1);
REQUIRE(is_in_lang(rhs, one));
REQUIRE(!is_in_lang(rhs, zero));
SECTION("failing minimal scenario") {
Nfa result;
uni(&result, lhs, rhs);
REQUIRE(is_in_lang(result, one));
REQUIRE(is_in_lang(result, zero));
}
}
EDIT: My test cases for Ondra's implementation worked without problem (I tested little bit more complex automata, however, this minimal example should suffice).
It looks like a good idea to extract simulation to stand alone library which one can use also in other libraries and tools. We should discuss this.
Why do we need to denote formula in this special way? Would not it be sufficient to write formula to " "?
Originally posted by @martinhruska in #4 (comment)
We should add return value type hints to all Python binding functions.
There are many named types "using ... that and that".
nfa.hh looks kind of scary.
My first guess is that it only makes the code harder to read, unles one memorises all of them.
I remember that we started with about five of them originally, in order to be able to swap the std containers in the nfa trnsition function.
I don't see why the other ones are there right now, in case there are really there for no big reason, then I woul dbe for dumping them.
We should remove VM related source code. VM is not finished and we would need significant amount of work to finish it. @kilohsakul claims that these redundant source code could scare potential users of our library. Actually, it scares primarly him, however we should make him happy by removing VM.
We are currently using C++14 standard. However, I believe we could benefit from the newer standards (C++20, or if C++20 support in compilers is not stable enough for us, C++17). Seeing as we do not need to use any particular specialities of C++20, I think it would be safe upgrading to C++20. Nevertheless, upgrading to at least C++17 should be completely safe. Is there any other reason why we have still remained on C++14 standard so far?
I myself wanted to use some methods on STL containers, yet because they were introduced in newer standards, I have to reimplement the functionality of these methods each time instead of simply calling them.
I have tested compilation of libMata with both C++17 and C++20 with g++ (GCC) 12.1.0
. The library compiled without a problem and tests run successfully both times.
To clean up nfa.h, and it is even needed since the same alphabets should be used in afa eventually.
Some, people complained, that it is strange to have 1.X.Y version of mata, since it is not finished.
Hence, I'm raising discussion, whether we should reset the version to 0.1.0, e.g. and continue with the clean state.
Technically, it should not be that hard.
This issue should be solved by Tomas Kocourek by integrating his implementation of AFA to the Mata library.
We should discuss and decide a new name of library.
There are multiple occurrences where words (as in, sequences of symbols) are addressed by string: in user defined types, function names, local variables etc.
It has been decided that, for the matter of consistency, all such occurrences should be renamed to word. Furthermore, word does not collide with C++ string type.
Once a format specification is complete, we will need support at least for NFA and AFA parsing.
As time goes on and multiple Mata modules are implemented and modified (NFA, AFA, parser, etc.), the warnings returned by the compiler pile up. It becomes increasingly harder to search the build log for errors and meaningful warnings.
We should try to do some spring-cleaning a bit early in the year and fix as many warnings as possible. Write tests for unused functions, add (void) param
in unimplemented functions and resolve other meaningful warnings so that it is easier for the developers to look through the build log and spot actually important warnings.
We decided that:
size()
of Delta
is number of triples in transition relationadd_trans
should be method of Delta
.Delta
and NumberPredicate
to provide the function max_state()
which returns maximal state used in them.Delta
will probably need to keep internal counter of states where maximal state seen in lhs and rhs will be stored.Nfa
will have its own counter which will be increased by add_state()
Nfa
will have method max_state()
returning maximum of its own counter, and max states of initial, final states and delta
.false
, is it the state 1000 in automaton or not?I am starting an issue with useful automata operations that could be included to the library.
trim
removing redundant states (for some reason the regex translator generates many redundant states)simulation-based minimization
reduction of nondeterministic automataThe page https://verifit.github.io/mata referenced from README.md does not exist.
Constants that can occur in automata are not handled right now during mintermization.
For example , for this NFA:
@NFA-bits
%States-enum q r s
%Alphabet-auto
%Initial q
%Final r
q true r
r a1 & a2 s
s false s
the resulting mintermized NFA should have transitions from q
to r
for all minterms (created from the transition q true r
), while there should be no transitions created from s false s
.
For AFA, taking this example:
@AFA-bits
%Initial q0
%Final t
q0 (true & q2 & q3 & q0) | (a4 & !a5 & !a6 & !a7 & q0 & q1 & q2)
q1 false
q2 q1
q3 true
There will be two minterms: a4 & !a5 & !a6 & !a7
and its negation. Then, from q0
there should be two transitions (one for each minterm) in mintermized automaton going to q2 & q3 & q0
created from (true & q2 & q3 & q0)
and one transition going to q0 & q1 & q2
with minterm representing a4 & !a5 & !a6 & !a7
. From q1
there should be no transitions; the transition q2 q1
has the same meaning as q2 true & q1
and from q3
there will be two transitions (again, one for each minterm) going to true
.
We agreeed that it would be nice to add to alphabets support for defining epsilon.
Code is mostly undocumented, even interface in header files. It looks like a good idea to add documentation to code.
Remove structure NfaWrapper.
What should we have in headers? Should they be somehow uniform?
Naming of files, _ or -?
Lets try to start using the current mata from this git repo in the string solver.
What do we need to do?
I guess we first need to merge the pull requests, right? Ca we do it now? Lets not wait for every little thing to get fully resolved, is there perhaps a way to leave if for later?
When shortest words are computed, Mata considers all symbols on transitions as normal symbols and adds them, if appropriate, to the sets of the shortest words for corresponding states.
However, if we have an automaton with some epsilon symbol and want to get the set of the shortest words for some states, we will get words with the epsilon symbol possibly included in the words. Furthermore, as epsilon transitions does not cost anything, the shortest words would not be computed correctly.
We decided that an epsilon symbol can be specified for some operations by passing an epsilon symbol to the corresponding function. Hence, we need to update the algorithm for getting the shortest words to optionally allow specifying an epsilon symbol to be passed to the function. The algorithm will then have to be updated to appropriately handle encountered epsilon symbols when computing the shortest words.
With PRs #36, #40 and #41, there are multiple new functions needing Python bindings. Once #41 is reviewed and merged, we need to implement Python bindings for the new functions these PRs introduce.
The new functions which require Python bindings are:
Mata::Nfa::SegNfa::noodlify()
,Mata::Nfa::intersection()
(both implementations: classic and epsilon transitions preserving),Mata::Nfa::concatenate()
,Mata::Nfa::equivalence_check()
(both implementations),Mata::Nfa::Nfa::trim()
,Mata::Nfa::Nfa::get_useful_states()
,Mata::Nfa::Nfa::get_reachale_states()
,Mata::Nfa::Nfa::get_terminating_states()
,Mata::Nfa::Nfa::remove_epsilon()
,Mata::Nfa::SegNfa::Segmentation()
(new constructors),Mata::Nfa::SegNfa::Segmentation::get_epsilon_depths()
,Mata::Nfa::SegNfa::Segmentation::get_segments()
,Mata::Nfa::Nfa::get_transitions_from_state()
,Mata::Nfa::Nfa::get_transitions_to_state()
,Mata::Nfa::Nfa::get_trans_from_state_as_sequence()
,Mata::Nfa::Nfa::get_trans_as_sequence()
,Mata::Nfa::Nfa()
(both new constructors),Mata::Nfa::Nfa::get_digraph()
,Mata::Nfa::Nfa::make_final()
(add missing implementation for make_final(states)
, similar to Python bindings add_initial_state()
and add_initial_states()
),Mata::Nfa::Nfa::clear_initial()
,Mata::Nfa::Nfa::clear_final()
,Mata::Nfa::Nfa::remove_initial()
(both implementations),Mata::Nfa::Nfa::remove_final()
(both implementations),Mata::Nfa::Nfa::reset_initial()
(both implementations),Mata::Nfa::Nfa::reset_final()
(both implementations),Mata::Nfa::Nfa::increase_size_for_state()
,Mata::Nfa::Nfa::remove_trans()
(both implementations).We should:
Currently, the notebooks are not checked, and I fear they are out of sync with current changes.
Add its testing (wrt https://stackoverflow.com/questions/35471894/can-i-run-jupyter-notebook-cells-in-commandline) to github actions so we can fix it always right away.
Make a special kind of container for properties of states?
To be used for initial, final states, various flags used in exlorations, searches.
It needs very fast test, addition, removal, and fast reset (emptying) would be also good.
A simple version - bool array indexed by statesis.
is_set(), set(i), reset(i), get_set() -- returns a vector of flagged states, perhaps get_not_set()
This is probably enough.
A more complex version also has an unordered vector of states that remembers which flags are set.
Test only tests the flag.
Insert sets the flag and pushes back the state to the vector.
Remove rests the flag, does nothing with the vector.
Reset iterates through the vector and resets flags of its states.
One shuold have the choice not to use the vector.
Even more complicated version replaces the unordered vector with something with easy removal in the middle, such as list. The flag can have a pointer to its occurence in this container, hence remove can go remove just that one element.
....
A few comments on the automata format:
After a merge, the following action fails.
The string variable NFA_TYPE
defined here and declared here is always empty when used later in code. I compile code with clang in the following version
Apple clang version 13.1.6 (clang-1316.0.21.2.3)
Target: arm64-apple-darwin21.4.0
Thread model: posix
The error leads to failures in unit tests 11,13,14,40, since the NFA_TYPE
is used in virtual machine to register dispatcher for NFA and no dispatcher is found for NFA the string empty.
Any ideas what could be wrong with the implementation?
P.S.:
I checked that the NFA_TYPE
string is empty by adding the following print statment std::cout << "HERE "<< Vata2::Nfa::TYPE_NFA;
to function Vata2::Nfa::init
in the file src/nfa-dispatch.cc
.
Maybe making classes for transition relation would be good after all. Lets try to discuss here.
The reason is that we actually will want to modify the data structures,
mainly to make extensions of the library. So far, it seems that we will want to:
And we will probably want to be able to fine tune some data structures after all. Maybe not much and often, but it would be good to make it possible.
When working with the regex parser (with python binding), I got the following fishy outcomes:
mata.Nfa.from_regex("[qQrR]*")
yields
initial_states: [0] final_states: [0] transitions: 0-[113]→0 0-[114]→0
mata.Nfa.from_regex("[qr]*")
yields the same automaton as before
initial_states: [0] final_states: [0] transitions: 0-[113]→0 0-[114]→0
Currently they have 5 parameters, three are not used.
Maybe make them optional?
The alphabet parameter should probably dissappear from inclusion and equivalence, regardless nfa having it as a property or not.
If there are more skeletons like this, we chould clean them.
Another issue related to user friendliness of these functions, I am still not sure wheter making more header files and more namespaces for these functions was a good idea. For me it gets hard to call these functions, I need to search for the right name space, include, use strange keyboard shortcuts in CLion, .... it is stressful for an old person. I can do it eventually, but it eats brain cycles. Not sure what is better here.
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.