Why is this ANTLR grammar reporting errors? - antlr
I have a fairly simple grammar designed to parse URIs. It is compiled with the help of antlr4-maven-plugin. Compiling produces no warnings or errors. I wrote a simple test.
Uri.g4:
/**
* Uniform Resource Identifier (RFC 3986).
*
* #author Oliver Yasuna
* #see RFC 3986
* #since 1.0.0
*/
grammar Uri;
options {
tokenVocab = Common;
}
#header {
package com.oliveryasuna.http.antlr;
}
// Parser
//--------------------------------------------------
pctEncoded
: '%' HEXDIG HEXDIG
;
reserved
: genDelims | subDelims
;
genDelims
: ':' | '/' | '?' | '#' | '[' | ']' | '#'
;
subDelims
: '!' | '$' | '&' | '\'' | '(' | ')' | '*' | '+' | ',' | ';' | '='
;
unreserved
: ALPHA | DIGIT | '-' | '.' | '_' | '~'
;
uri
: scheme ':' hierPart ('?' query)? ('#' fragment_)?
;
hierPart
: '//' authority pathAbEmpty
| pathAbsolute
| pathRootless
| pathEmpty
;
scheme
: ALPHA (ALPHA | DIGIT | '+' | '-' | '.')*
;
authority
: (userinfo '#')? host (':' port)?
;
userinfo
: (unreserved | pctEncoded | subDelims | ':')*
;
host
: ipLiteral
| ipv4Address
| regName
;
ipLiteral
: '[' (ipv6Address | ipvFuture) ']'
;
ipvFuture
: 'v' HEXDIG+ '.' (unreserved | subDelims | ':')+
;
ipv6Address
: '::' (h16 ':') (h16 ':') (h16 ':') (h16 ':') (h16 ':') (h16 ':') ls32
| '::' (h16 ':') (h16 ':') (h16 ':') (h16 ':') (h16 ':') ls32
| h16? '::' (h16 ':') (h16 ':') (h16 ':') (h16 ':') ls32
| ((h16 ':')? h16)? '::' (h16 ':') (h16 ':') (h16 ':') ls32
| ((h16 ':')? (h16 ':')? h16)? '::' (h16 ':') (h16 ':') ls32
| ((h16 ':')? (h16 ':')? (h16 ':')? h16)? '::' h16 ':' ls32
| ((h16 ':')? (h16 ':')? (h16 ':')? (h16 ':')? h16)? '::' ls32
| ((h16 ':')? (h16 ':')? (h16 ':')? (h16 ':')? (h16 ':')? h16)? '::' h16
| ((h16 ':')? (h16 ':')? (h16 ':')? (h16 ':')? (h16 ':')? (h16 ':')? h16)? '::'
;
ls32
: (h16 ':' h16)
| ipv4Address
;
h16
: HEXDIG HEXDIG? HEXDIG? HEXDIG?
;
ipv4Address
: decOctet '.' decOctet '.' decOctet '.' decOctet
;
decOctet
: DIGIT
| ('1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') DIGIT
| '1' DIGIT DIGIT
| '2' ('0' | '1' | '2' | '3' | '4') DIGIT
| '2' '5' ('0' | '1' | '2' | '3' | '4' | '5')
;
regName
: (unreserved | pctEncoded | subDelims)*
;
port
: DIGIT*
;
path
: pathAbEmpty
| pathAbsolute
| pathNoScheme
| pathRootless
| pathEmpty
;
pathAbEmpty
: ('/' segment)*
;
pathAbsolute
: '/' (segmentNz ('/' segment)?)?
;
pathNoScheme
: segmentNzNc ('/' segment)?
;
pathRootless
: segmentNz ('/' segment)?
;
pathEmpty
: // TODO: 0<pchar>.
;
segment
: pchar*
;
segmentNz
: pchar+
;
segmentNzNc
: (unreserved | pctEncoded | subDelims | '#')+
;
pchar
: unreserved | pctEncoded | subDelims | ':' | '#'
;
query
: (pchar | '/' | '?')*
;
fragment_
: (pchar | '/' | '?')*
;
uriReference
: uri
| relativeRef
;
relativeRef
: relativePart ('?' query)? ('#' fragment_)?
;
relativePart
: '//' authority pathAbEmpty
| pathAbEmpty
| pathNoScheme
| pathEmpty
;
absoluteUri
: scheme ':' hierPart ('?' query)?
;
Common.g4:
lexer grammar Common;
// ASCII
//--------------------------------------------------
BANG : '!' ;
//DOUBLE_QUOTE : '"' ;
HASH : '#' ;
DOLLAR : '$' ;
PERCENT : '%' ;
AND : '&' ;
SINGLE_QUOTE : '\'' ;
LEFT_PARENTHESES : '(' ;
RIGHT_PARENTHESES : ')' ;
STAR : '*' ;
PLUS : '+' ;
COMMA : ',' ;
MINUS : '-' ;
DOT : '.' ;
SLASH : '/' ;
COLON : ':' ;
SEMICOLON : ';' ;
LEFT_ANGLE_BRACKET : '<' ;
EQUAL : '=' ;
RIGHT_ANGLE_BRACKET : '>' ;
QUESTION : '?' ;
AT : '#' ;
LEFT_SQUARE_BRACKET : '[' ;
BACKSLASH : '\\' ;
RIGHT_SQUARE_BRACKET : ']' ;
CARROT : '^' ;
UNDERSCORE : '_' ;
BACKTICK : '`' ;
LEFT_CURLY_BRACKET : '{' ;
BAR : '|' ;
RIGHT_CURLY_BRACKET : '}' ;
TILDE : '~' ;
// Core
//--------------------------------------------------
// Taken from ABNF.
ALPHA : [a-zA-Z] ;
DIGIT : [0-9] ;
HEXDIG : [0-9a-fA-F] ;
DQUOTE : '"' ;
SP : ' ' ;
HTAB : '\t' ;
WSP : SP | HTAB ;
//LWSP : (WSP | CRLF WSP)* ;
VCHAR : [\u0021-\u007F] ;
CHAR : [\u0001-\u007F] ;
OCTET : [\u0000-\u00FF] ;
CTL : [\u0000-\u001F\u007F] ;
CR : '\r' ;
LF : '\n' ;
CRLF : CR LF ;
BIT : '0' | '1' ;
// Miscellaneous
//--------------------------------------------------
DOUBLE_SLASH : '//' ;
DOUBLE_COLON : '::' ;
LOWER_V : 'v' ;
ZERO : '0' ;
ONE : '1' ;
TWO : '2' ;
THREE : '3' ;
FOUR : '4' ;
FIVE : '5' ;
SIX : '6' ;
SEVEN : '7' ;
EIGHT : '8' ;
NINE : '9' ;
Test method:
#Test
final void google() {
final String uri = "https://www.google.com/";
final UriLexer lexer = new UriLexer(new ANTLRInputStream(uri));
final UriParser parser = new UriParser(new CommonTokenStream(lexer));
parser.addErrorListener(new BaseErrorListener() {
#Override
public void syntaxError(final Recognizer<?, ?> recognizer, final Object offendingSymbol, final int line, final int charPositionInLine, final String msg, final RecognitionException e) {
throw new IllegalStateException("[" + line + ":" + charPositionInLine + "] Symbol [" + offendingSymbol + "] produced error: " + msg + ".", e);
}
});
Assertions.assertDoesNotThrow(parser::uri);
}
I get the following errors when I input https://www.google.com/.
I have absolute no idea what is causing these parsing errors. Does anyone have an idea?
Output:
line 1:0 token recognition error at: 'h'
line 1:1 token recognition error at: 't'
line 1:2 token recognition error at: 't'
line 1:3 token recognition error at: 'p'
line 1:4 token recognition error at: 's'
line 1:5 missing '6' at ':'
ANTLR's lexer has a strict separation between parsing and tokenizing/lexing. The lexer also works independently from the parser and creates tokens based on 2 simple rules:
try to consume as many characters for a single lexer rule
when 2 or more lexer rules match the same characters, let the one defined first "win"
If we now look at your rules:
ALPHA : [a-zA-Z] ;
DIGIT : [0-9] ;
HEXDIG : [0-9a-fA-F] ;
it is clear that the lexer rule HEXDIG will never be matched because either ALPHA or DIGIT will match whatever HEXDIG matches and are defined before HEXDIG. Switching the order:
HEXDIG : [0-9a-fA-F] ;
ALPHA : [a-zA-Z] ;
DIGIT : [0-9] ;
will not work because any digit will now never become a DIGIT token, and a F will now also never become a ALPHA.
Note that this is just a single example: there are more of such cases in you lexer grammar.
A solution would be to move some of the responsibility to the parser instead of the lexer:
A : [aA];
B : [bB];
C : [cC];
D : [dD];
E : [eE];
F : [fF];
G : [gG];
H : [hH];
I : [iI];
J : [jJ];
K : [kK];
L : [lL];
M : [mM];
N : [nN];
O : [oO];
P : [pP];
Q : [qQ];
R : [rR];
S : [sS];
T : [tT];
U : [uU];
V : [vV];
W : [wW];
X : [xX];
Y : [yY];
Z : [zZ];
D0 : '0';
D1 : '1';
D2 : '2';
D3 : '3';
D4 : '4';
D5 : '5';
D6 : '6';
D7 : '7';
D8 : '8';
D9 : '9';
and then in the parser you do:
alpha
: A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
;
digit
: D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9
;
hexdig
: A | B | C | D | E | F | digit
;
Also, remove all the literal tokens like '6' from the parser and use the proper lexer rule instead (D6, in this case). Whenever the parser sees such a literal token, which is not defined in the lexer, it "magically" creates a new token for it, resulting in mysterious error/warning messages. Best to remove all (and I mean all!) such literal token from the parser.
In addition to the answer Bart made on the grammar--all correct--this is not how to write a split grammar!
You must have "parser grammar UriParser;" in UriParser.g4 (rename Uri.g4 to UriParser.g4), and "lexer grammar UriLexer;" in UriLexer.g4 (rename Common.g4 to UriLexer.g4).
If you try to generate the parser for your original "split" grammar, you get three .tokens files generated by the Antlr tool, all different in size and contents. That indicates there is likely no coordination of the token types between the lexer and parser. That doesn't have anything to do with the "token recognition error" because as Bart says, the lexer operates completely independently from the parser. But, it will have an impact when you start testing the grammar productions with other input.
Also, you should never include #header { package ...; } in the grammar. You need to the -package option instead. Using the #header makes the grammar completely unportable to other targets, and creates a problem if you have multiple grammars in one directory, some with the #header and some without.
If you fix these problems, the code parses your input--with the caveat that your lexer rules are not correct (see Bart's answer).
It's not clear why you split the grammar to begin with.
UriParser.g4:
/**
* Uniform Resource Identifier (RFC 3986).
*
* #author Oliver Yasuna
* #see RFC 3986
* #since 1.0.0
*/
parser grammar UriParser;
options {
tokenVocab = UriLexer;
}
// Parser
//--------------------------------------------------
pctEncoded
: '%' HEXDIG HEXDIG
;
reserved
: genDelims | subDelims
;
genDelims
: ':' | '/' | '?' | '#' | '[' | ']' | '#'
;
subDelims
: '!' | '$' | '&' | '\'' | '(' | ')' | '*' | '+' | ',' | ';' | '='
;
unreserved
: ALPHA | DIGIT | '-' | '.' | '_' | '~'
;
uri
: scheme ':' hierPart ('?' query)? ('#' fragment_)?
;
hierPart
: '//' authority pathAbEmpty
| pathAbsolute
| pathRootless
| pathEmpty
;
scheme
: ALPHA (ALPHA | DIGIT | '+' | '-' | '.')*
;
authority
: (userinfo '#')? host (':' port)?
;
userinfo
: (unreserved | pctEncoded | subDelims | ':')*
;
host
: ipLiteral
| ipv4Address
| regName
;
ipLiteral
: '[' (ipv6Address | ipvFuture) ']'
;
ipvFuture
: 'v' HEXDIG+ '.' (unreserved | subDelims | ':')+
;
ipv6Address
: '::' (h16 ':') (h16 ':') (h16 ':') (h16 ':') (h16 ':') (h16 ':') ls32
| '::' (h16 ':') (h16 ':') (h16 ':') (h16 ':') (h16 ':') ls32
| h16? '::' (h16 ':') (h16 ':') (h16 ':') (h16 ':') ls32
| ((h16 ':')? h16)? '::' (h16 ':') (h16 ':') (h16 ':') ls32
| ((h16 ':')? (h16 ':')? h16)? '::' (h16 ':') (h16 ':') ls32
| ((h16 ':')? (h16 ':')? (h16 ':')? h16)? '::' h16 ':' ls32
| ((h16 ':')? (h16 ':')? (h16 ':')? (h16 ':')? h16)? '::' ls32
| ((h16 ':')? (h16 ':')? (h16 ':')? (h16 ':')? (h16 ':')? h16)? '::' h16
| ((h16 ':')? (h16 ':')? (h16 ':')? (h16 ':')? (h16 ':')? (h16 ':')? h16)? '::'
;
ls32
: (h16 ':' h16)
| ipv4Address
;
h16
: HEXDIG HEXDIG? HEXDIG? HEXDIG?
;
ipv4Address
: decOctet '.' decOctet '.' decOctet '.' decOctet
;
decOctet
: DIGIT
| ('1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') DIGIT
| '1' DIGIT DIGIT
| '2' ('0' | '1' | '2' | '3' | '4') DIGIT
| '2' '5' ('0' | '1' | '2' | '3' | '4' | '5')
;
regName
: (unreserved | pctEncoded | subDelims)*
;
port
: DIGIT*
;
path
: pathAbEmpty
| pathAbsolute
| pathNoScheme
| pathRootless
| pathEmpty
;
pathAbEmpty
: ('/' segment)*
;
pathAbsolute
: '/' (segmentNz ('/' segment)?)?
;
pathNoScheme
: segmentNzNc ('/' segment)?
;
pathRootless
: segmentNz ('/' segment)?
;
pathEmpty
: // TODO: 0<pchar>.
;
segment
: pchar*
;
segmentNz
: pchar+
;
segmentNzNc
: (unreserved | pctEncoded | subDelims | '#')+
;
pchar
: unreserved | pctEncoded | subDelims | ':' | '#'
;
query
: (pchar | '/' | '?')*
;
fragment_
: (pchar | '/' | '?')*
;
uriReference
: uri
| relativeRef
;
relativeRef
: relativePart ('?' query)? ('#' fragment_)?
;
relativePart
: '//' authority pathAbEmpty
| pathAbEmpty
| pathNoScheme
| pathEmpty
;
absoluteUri
: scheme ':' hierPart ('?' query)?
;
UriLexer.g4:
lexer grammar UriLexer;
// ASCII
//--------------------------------------------------
BANG : '!' ;
//DOUBLE_QUOTE : '"' ;
HASH : '#' ;
DOLLAR : '$' ;
PERCENT : '%' ;
AND : '&' ;
SINGLE_QUOTE : '\'' ;
LEFT_PARENTHESES : '(' ;
RIGHT_PARENTHESES : ')' ;
STAR : '*' ;
PLUS : '+' ;
COMMA : ',' ;
MINUS : '-' ;
DOT : '.' ;
SLASH : '/' ;
COLON : ':' ;
SEMICOLON : ';' ;
LEFT_ANGLE_BRACKET : '<' ;
EQUAL : '=' ;
RIGHT_ANGLE_BRACKET : '>' ;
QUESTION : '?' ;
AT : '#' ;
LEFT_SQUARE_BRACKET : '[' ;
BACKSLASH : '\\' ;
RIGHT_SQUARE_BRACKET : ']' ;
CARROT : '^' ;
UNDERSCORE : '_' ;
BACKTICK : '`' ;
LEFT_CURLY_BRACKET : '{' ;
BAR : '|' ;
RIGHT_CURLY_BRACKET : '}' ;
TILDE : '~' ;
// Core
//--------------------------------------------------
// Taken from ABNF.
ALPHA : [a-zA-Z] ;
DIGIT : [0-9] ;
HEXDIG : [0-9a-fA-F] ;
DQUOTE : '"' ;
SP : ' ' ;
HTAB : '\t' ;
WSP : SP | HTAB ;
//LWSP : (WSP | CRLF WSP)* ;
VCHAR : [\u0021-\u007F] ;
CHAR : [\u0001-\u007F] ;
OCTET : [\u0000-\u00FF] ;
CTL : [\u0000-\u001F\u007F] ;
CR : '\r' ;
LF : '\n' ;
CRLF : CR LF ;
BIT : '0' | '1' ;
// Miscellaneous
//--------------------------------------------------
DOUBLE_SLASH : '//' ;
DOUBLE_COLON : '::' ;
LOWER_V : 'v' ;
ZERO : '0' ;
ONE : '1' ;
TWO : '2' ;
THREE : '3' ;
FOUR : '4' ;
FIVE : '5' ;
SIX : '6' ;
SEVEN : '7' ;
EIGHT : '8' ;
NINE : '9' ;
Related
Pandas How to rename columns that don't have names, but they're indexed as 0, 1, 2, 3... etc
I don't know how to rename columns that are unnamed. I have tried both approaches where I am putting the indices in quoutes and not, like this, and it didn't work: train_dataset_with_pred_new_df.rename(columns={ 0 : 'timestamp', 1 : 'open', 2 : 'close', 3 : 'high', 4 : 'low', 5 : 'volume', 6 : 'CCI7', 7 : 'DI+',\ 8 : 'DI-', 9 : 'ADX', 10 : 'MACD Main', 11 : 'MACD Signal', 12 : 'MACD histogram', 13 : 'Fisher Transform',\ 14 : 'Fisher Trigger' }) And train_dataset_with_pred_new_df.rename(columns={ '0' : 'timestamp', '1' : 'open', '2' : 'close', '3' : 'high', '4' : 'low', '5' : 'volume', '6' : 'CCI7', '8' : 'DI+',\ '9' : 'DI-', '10' : 'ADX', '11' : 'MACD Main', '12' : 'MACD Signal', '13' : 'MACD histogram', '15' : 'Fisher Transform',\ '16' : 'Fisher Trigger' }) So If both didn't worked, how do I rename them? Thank you for your help in advance :)
pandas.DataFrame.rename returns a new DataFrame if the parameter inplace is False. You need to reassign your dataframe : train_dataset_with_pred_new_df= train_dataset_with_pred_new_df.rename(columns={ 0 : 'timestamp', 1 : 'open', 2 : 'close', 3 : 'high', 4 : 'low', 5 : 'volume', 6 : 'CCI7', 7 : 'DI+',\ 8 : 'DI-', 9 : 'ADX', 10 : 'MACD Main', 11 : 'MACD Signal', 12 : 'MACD histogram', 13 : 'Fisher Transform',\ 14 : 'Fisher Trigger'}) Or simply use inplace=True: train_dataset_with_pred_new_df.rename(columns={ 0 : 'timestamp', 1 : 'open', 2 : 'close', 3 : 'high', 4 : 'low', 5 : 'volume', 6 : 'CCI7', 7 : 'DI+', 8 : 'DI-', 9 : 'ADX', 10 : 'MACD Main', 11 : 'MACD Signal', 12 : 'MACD histogram', 13 : 'Fisher Transform', 14 : 'Fisher Trigger' }, inplace=True)
df.rename(columns={ df.columns[1]: "your value" }, inplace = True)
What you are trying to do is renaming the index. Instead of renaming existing columns you are renaming index. So rename index and not columns. train_dataset_with_pred_new_df.rename( index={ 0 : 'timestamp', 1 : 'open', 2 : 'close', 3 : 'high', 4 : 'low', 5 : 'volume', 6 : 'CCI7', 7 : 'DI+', 8 : 'DI-', 9 : 'ADX', 10 : 'MACD Main', 11 : 'MACD Signal', 12 : 'MACD histogram', 13 : 'Fisher Transform', 14 : 'Fisher Trigger' }, inplace=True)
As it looks like you want to reassign all names, simply do: df.columns = ['timestamp', 'open', 'close', 'high', 'low', 'volume', 'CCI7', 'DI+', 'DI-', 'ADX', 'MACD Main', 'MACD Signal', 'MACD histogram', 'Fisher Transform', 'Fisher Trigger'] Or, in a chain: df.set_axis(['timestamp', 'open', 'close', 'high', 'low', 'volume', 'CCI7', 'DI+', 'DI-', 'ADX', 'MACD Main', 'MACD Signal', 'MACD histogram', 'Fisher Transform', 'Fisher Trigger'], axis=1)
Mixed Integer Linear Optimization with Pyomo - Travelling salesman problem
I am trying to solve a travelling salesman problem with Pyomo framework. However, I am stuck, as the solver is informing me that I have formulated it as infeasible. import numpy as np import pyomo.environ as pyo from pyomo.environ import * from pyomo.opt import SolverFactory journey_distances = np.array([[0, 28, 34, 45, 36], [28, 0, 45, 52, 64], [34, 45, 0, 11, 34], [45, 52, 11, 0, 34], [36, 64, 34, 34, 0]]) # create variables - integers num_locations = M.shape[0] model = pyo.ConcreteModel() model.journeys = pyo.Var(range(num_locations), range(num_locations), domain=pyo.Binary, bounds = (0,None)) journeys = model.journeys # add A to B constraints model.AtoB = pyo.ConstraintList() model.BtoA = pyo.ConstraintList() AtoB = model.AtoB BtoA = model.BtoA AtoB_sum = [sum([ journeys[i,j] for j in range(num_locations) if i!=j]) for i in range(num_locations)] BtoA_sum = [sum([ journeys[i,j] for i in range(num_locations) if j!=i]) for j in range(num_locations)] for journey_sum in range(num_locations): AtoB.add(AtoB_sum[journey_sum] == 1) if journey_sum <num_locations -1: BtoA.add(BtoA_sum[journey_sum] == 1) # add auxilliary variables to ensure that each successive journey ends and starts on the same town. E.g. A to B, then B to C. # u_j - u_i >= -(n+1) + num_locations*journeys_{ij} for i,j = 1...n, i!=j model.successive_aux = pyo.Var(range(0,num_locations), domain = pyo.Integers, bounds = (0,num_locations-1)) model.successive_constr = pyo.ConstraintList() successive_aux = model.successive_aux successive_constr = model.successive_constr successive_constr.add(successive_aux[0] == 1) for i in range(num_locations): for j in range(num_locations): if i!=j: successive_constr.add(successive_aux[j] - successive_aux[i] >= -(num_locations - 1) + num_locations*journeys[i,j]) obj_sum = sum([ sum([journey_distances [i,j]*journeys[i,j] for j in range(num_locations) if i!=j]) for i in range(num_locations)]) model.obj = pyo.Objective(expr = obj_sum, sense = minimize) opt = SolverFactory('cplex') opt.solve(model) journey_res = np.array([model.journeys[journey].value for journey in journeys]) print(journey_res) # results output is: print(results) Problem: - Lower bound: -inf Upper bound: inf Number of objectives: 1 Number of constraints: 31 Number of variables: 26 Number of nonzeros: 98 Sense: unknown Solver: - Status: ok User time: 0.02 Termination condition: infeasible Termination message: MIP - Integer infeasible. Error rc: 0 Time: 0.10198116302490234 # model.pprint() 7 Set Declarations AtoB_index : Size=1, Index=None, Ordered=Insertion Key : Dimen : Domain : Size : Members None : 1 : Any : 5 : {1, 2, 3, 4, 5} BtoA_index : Size=1, Index=None, Ordered=Insertion Key : Dimen : Domain : Size : Members None : 1 : Any : 4 : {1, 2, 3, 4} journeys_index : Size=1, Index=None, Ordered=False Key : Dimen : Domain : Size : Members None : 2 : journeys_index_0*journeys_index_1 : 25 : {(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)} journeys_index_0 : Size=1, Index=None, Ordered=False Key : Dimen : Domain : Size : Members None : 1 : Any : 5 : {0, 1, 2, 3, 4} journeys_index_1 : Size=1, Index=None, Ordered=False Key : Dimen : Domain : Size : Members None : 1 : Any : 5 : {0, 1, 2, 3, 4} successive_aux_index : Size=1, Index=None, Ordered=False Key : Dimen : Domain : Size : Members None : 1 : Any : 5 : {0, 1, 2, 3, 4} successive_constr_index : Size=1, Index=None, Ordered=Insertion Key : Dimen : Domain : Size : Members None : 1 : Any : 21 : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21} 2 Var Declarations journeys : Size=25, Index=journeys_index Key : Lower : Value : Upper : Fixed : Stale : Domain (0, 0) : 0 : None : 1 : False : True : Binary (0, 1) : 0 : None : 1 : False : True : Binary (0, 2) : 0 : None : 1 : False : True : Binary (0, 3) : 0 : None : 1 : False : True : Binary (0, 4) : 0 : None : 1 : False : True : Binary (1, 0) : 0 : None : 1 : False : True : Binary (1, 1) : 0 : None : 1 : False : True : Binary (1, 2) : 0 : None : 1 : False : True : Binary (1, 3) : 0 : None : 1 : False : True : Binary (1, 4) : 0 : None : 1 : False : True : Binary (2, 0) : 0 : None : 1 : False : True : Binary (2, 1) : 0 : None : 1 : False : True : Binary (2, 2) : 0 : None : 1 : False : True : Binary (2, 3) : 0 : None : 1 : False : True : Binary (2, 4) : 0 : None : 1 : False : True : Binary (3, 0) : 0 : None : 1 : False : True : Binary (3, 1) : 0 : None : 1 : False : True : Binary (3, 2) : 0 : None : 1 : False : True : Binary (3, 3) : 0 : None : 1 : False : True : Binary (3, 4) : 0 : None : 1 : False : True : Binary (4, 0) : 0 : None : 1 : False : True : Binary (4, 1) : 0 : None : 1 : False : True : Binary (4, 2) : 0 : None : 1 : False : True : Binary (4, 3) : 0 : None : 1 : False : True : Binary (4, 4) : 0 : None : 1 : False : True : Binary successive_aux : Size=5, Index=successive_aux_index Key : Lower : Value : Upper : Fixed : Stale : Domain 0 : 0 : None : 4 : False : True : Integers 1 : 0 : None : 4 : False : True : Integers 2 : 0 : None : 4 : False : True : Integers 3 : 0 : None : 4 : False : True : Integers 4 : 0 : None : 4 : False : True : Integers 1 Objective Declarations obj : Size=1, Index=None, Active=True Key : Active : Sense : Expression None : True : minimize : 28*journeys[0,1] + 34*journeys[0,2] + 45*journeys[0,3] + 36*journeys[0,4] + 28*journeys[1,0] + 45*journeys[1,2] + 52*journeys[1,3] + 64*journeys[1,4] + 34*journeys[2,0] + 45*journeys[2,1] + 11*journeys[2,3] + 34*journeys[2,4] + 45*journeys[3,0] + 52*journeys[3,1] + 11*journeys[3,2] + 34*journeys[3,4] + 36*journeys[4,0] + 64*journeys[4,1] + 34*journeys[4,2] + 34*journeys[4,3] 3 Constraint Declarations AtoB : Size=5, Index=AtoB_index, Active=True Key : Lower : Body : Upper : Active 1 : 1.0 : journeys[0,1] + journeys[0,2] + journeys[0,3] + journeys[0,4] : 1.0 : True 2 : 1.0 : journeys[1,0] + journeys[1,2] + journeys[1,3] + journeys[1,4] : 1.0 : True 3 : 1.0 : journeys[2,0] + journeys[2,1] + journeys[2,3] + journeys[2,4] : 1.0 : True 4 : 1.0 : journeys[3,0] + journeys[3,1] + journeys[3,2] + journeys[3,4] : 1.0 : True 5 : 1.0 : journeys[4,0] + journeys[4,1] + journeys[4,2] + journeys[4,3] : 1.0 : True BtoA : Size=4, Index=BtoA_index, Active=True Key : Lower : Body : Upper : Active 1 : 1.0 : journeys[1,0] + journeys[2,0] + journeys[3,0] + journeys[4,0] : 1.0 : True 2 : 1.0 : journeys[0,1] + journeys[2,1] + journeys[3,1] + journeys[4,1] : 1.0 : True 3 : 1.0 : journeys[0,2] + journeys[1,2] + journeys[3,2] + journeys[4,2] : 1.0 : True 4 : 1.0 : journeys[0,3] + journeys[1,3] + journeys[2,3] + journeys[4,3] : 1.0 : True successive_constr : Size=21, Index=successive_constr_index, Active=True Key : Lower : Body : Upper : Active 1 : 1.0 : successive_aux[0] : 1.0 : True 2 : -Inf : -4 + 5*journeys[0,1] - (successive_aux[1] - successive_aux[0]) : 0.0 : True 3 : -Inf : -4 + 5*journeys[0,2] - (successive_aux[2] - successive_aux[0]) : 0.0 : True 4 : -Inf : -4 + 5*journeys[0,3] - (successive_aux[3] - successive_aux[0]) : 0.0 : True 5 : -Inf : -4 + 5*journeys[0,4] - (successive_aux[4] - successive_aux[0]) : 0.0 : True 6 : -Inf : -4 + 5*journeys[1,0] - (successive_aux[0] - successive_aux[1]) : 0.0 : True 7 : -Inf : -4 + 5*journeys[1,2] - (successive_aux[2] - successive_aux[1]) : 0.0 : True 8 : -Inf : -4 + 5*journeys[1,3] - (successive_aux[3] - successive_aux[1]) : 0.0 : True 9 : -Inf : -4 + 5*journeys[1,4] - (successive_aux[4] - successive_aux[1]) : 0.0 : True 10 : -Inf : -4 + 5*journeys[2,0] - (successive_aux[0] - successive_aux[2]) : 0.0 : True 11 : -Inf : -4 + 5*journeys[2,1] - (successive_aux[1] - successive_aux[2]) : 0.0 : True 12 : -Inf : -4 + 5*journeys[2,3] - (successive_aux[3] - successive_aux[2]) : 0.0 : True 13 : -Inf : -4 + 5*journeys[2,4] - (successive_aux[4] - successive_aux[2]) : 0.0 : True 14 : -Inf : -4 + 5*journeys[3,0] - (successive_aux[0] - successive_aux[3]) : 0.0 : True 15 : -Inf : -4 + 5*journeys[3,1] - (successive_aux[1] - successive_aux[3]) : 0.0 : True 16 : -Inf : -4 + 5*journeys[3,2] - (successive_aux[2] - successive_aux[3]) : 0.0 : True 17 : -Inf : -4 + 5*journeys[3,4] - (successive_aux[4] - successive_aux[3]) : 0.0 : True 18 : -Inf : -4 + 5*journeys[4,0] - (successive_aux[0] - successive_aux[4]) : 0.0 : True 19 : -Inf : -4 + 5*journeys[4,1] - (successive_aux[1] - successive_aux[4]) : 0.0 : True 20 : -Inf : -4 + 5*journeys[4,2] - (successive_aux[2] - successive_aux[4]) : 0.0 : True 21 : -Inf : -4 + 5*journeys[4,3] - (successive_aux[3] - successive_aux[4]) : 0.0 : True 13 Declarations: journeys_index_0 journeys_index_1 journeys_index journeys AtoB_index AtoB BtoA_index BtoA successive_aux_index successive_aux successive_constr_index successive_constr obj If anyone can see what the problem is, and let me know, then that would be a great help.
I'm not overly familiar w/ coding TSP problems, and I'm not sure of all the details in your code, but this (below) is a problem. It seems you are coding successive_aux (call it sa for short) as a sequencing of integers. In this snippet (I chopped down to 3 points), if you think about the legal route of 0-1-2-0, sa_1 > sa_0 and sa_2 > sa_1, then it is infeasible to require sa_0 > sa_2. Also, your bounds on sa appear infeasible as well. In this example, sa_0 is 1, and the upper bound on sa is 2. Those are 2 "infeasibilities" in your formulation. Key : Lower : Body : Upper : Active 1 : 1.0 : successive_aux[0] : 1.0 : True 2 : -Inf : -2 + 3*journeys[0,1] - (successive_aux[1] - successive_aux[0]) : 0.0 : True 3 : -Inf : -2 + 3*journeys[0,2] - (successive_aux[2] - successive_aux[0]) : 0.0 : True 4 : -Inf : -2 + 3*journeys[1,0] - (successive_aux[0] - successive_aux[1]) : 0.0 : True 5 : -Inf : -2 + 3*journeys[1,2] - (successive_aux[2] - successive_aux[1]) : 0.0 : True 6 : -Inf : -2 + 3*journeys[2,0] - (successive_aux[0] - successive_aux[2]) : 0.0 : True 7 : -Inf : -2 + 3*journeys[2,1] - (successive_aux[1] - successive_aux[2]) : 0.0 : True
I'm not an optimization expert but it looks like you need to change the distances between the cities since you're basically saying that the distance from city1 to city1 = 0, city2 to city2 = 0 etc. If you change these distances to a very large number (say 1000000) the optimizer will never pick to go from city1 back to city1. Hope this helps.
Ability to get the "index" (or ordinal value) for each array entry in BigQuery?
In a data column in BigQuery, I have a JSON object with the structure: { "sections": [ { "secName": "Flintstones", "fields": [ { "fldName": "Fred", "age": 55 }, { "fldName": "Barney", "age": 44 } ] }, { "secName": "Jetsons", "fields": [ { "fldName": "George", "age": 33 }, { "fldName": "Elroy", "age": 22 } ] } ]} I'm hoping to unnest() and json_extract() to get results that resemble: id | section_num | section_name | field_num | field_name | field_age ----+--------------+--------------+-----------+------------+----------- 1 | 1 | Flintstones | 1 | Fred | 55 1 | 1 | Flintstones | 2 | Barney | 44 1 | 2 | Jetsons | 1 | George | 33 1 | 2 | Jetsons | 2 | Elroy | 22 So far, I have the query: SELECT id, json_extract_scalar(curSection, '$.secName') as section_name, json_extract_scalar(curField, '$.fldName') as field_name, json_extract_scalar(curField, '$.age') as field_age FROM `tick8s.test2` AS tbl LEFT JOIN unnest(json_extract_array(tbl.data, '$.sections')) as curSection LEFT JOIN unnest(json_extract_array(curSection, '$.fields')) as curField that yields: id | section_name | field_name | field_age ----+--------------+------------+----------- 1 | Flintstones | Fred | 55 1 | Flintstones | Barney | 44 1 | Jetsons | George | 33 1 | Jetsons | Elroy | 22 QUESTION: I'm not sure how, if possible, to get the section_num and field_num ordinal positions from their array index values? (If you are looking to duplicate my results, I have a table named test2 with 2 columns: id - INTEGER, REQUIRED data - STRING, NULLABLE and I insert the data with: insert into tick8s.test2 values (1, '{"sections": [' || '{' || '"secName": "Flintstones",' || '"fields": [' || '{ "fldName": "Fred", "age": 55 },' || '{ "fldName": "Barney", "age": 44 }' || ']' || '},' || '{' || '"secName": "Jetsons",' || '"fields": [' || '{ "fldName": "George", "age": 33 },' || '{ "fldName": "Elroy", "age": 22 }' || ']' || '}]}' ); )
Do you just want with offset? SELECT id, json_extract_scalar(curSection, '$.secName') as section_name, n_s, json_extract_scalar(curField, '$.fldName') as field_name, json_extract_scalar(curField, '$.age') as field_age, n_c FROM `tick8s.test2` tbl LEFT JOIN unnest(json_extract_array(tbl.data, '$.sections') ) curSection WITH OFFSET n_s LEFT JOIN unnest(json_extract_array(curSection, '$.fields') ) curField WITH OFFSET n_c;
Is it impossible to select a nondeterministic value of an array element in Promela?
Following is the Promela code that I am writing. 491 byte api1[5]; 492 byte api2[5]; 493 byte api3[5]; 494 byte reftask1[5] 495 byte reftask2[5]; 496 byte reftask3[5]; 497 byte rid1[5]; 498 byte rid2[5]; 499 byte rid3[5]; 500 501 502 proctype init_call(){ 503 byte i1 = 0; 504 do 505 :: (i1 == 5) -> break 506 :: else -> 507 select ( api1[i1]: 2 .. 9); 508 select ( api2[i1] : 2 .. 9); 509 select ( api3[i1] : 2 .. 9); 510 select ( reftask1[i1] : 1 .. 3); 511 select( reftask2[i1] : 1 .. 3); 512 select ( reftask3[i1] : 1 .. 3); 513 select ( rid[i1] : 0 .. 1); 514 select ( rid[i1] : 0 .. 1); 515 select ( rid[i1] : 0 .. 1); 516 i1++; 517 od 518 } But if I try to simulate the code, I get the error message as following, saw: '[', expected ':' spin: osek_sp2.pml:507, Error: expecting select ( name : constant .. constant ) near 'select' However, according to the syntax definition, I can't find any problem. SYNTAX select '(' varref ':' expr '..' expr ')' varref : name [ '[' any_expr ']' ] [ '.' varref ] What is the reason of this error message?
Patrick is right. I'd say that this is a bug. If you look into spinlex.c, you'll see that when it scans for name before : only alphanumeric characters are allowed: scan_to(':', isalnum, name) Anyway, select is just a shorthand for a sequence of assignments. So a work-around might be to write the assignments yourself, e.g. api1[i1] = 2; do :: (api1[i1] < 9) -> api1[i1]++ :: break od
Retrieve the collection of unionOf and intersectionOf for each OWL
I'm trying to extract intersectionOf and unionOf in an OWL file, where interesctionOf and unionOf consist of collection of classes, someValuesFrom or/and onProperty. I have created a SPARQL query which extracts the "collection" for the intersectionOf, but the problem is that some of the retrieved data are not related to the class. For example, I have class called man. This class has an equivalent class which is intersectionOf of three classes, namely, adult,person, and male .My SPARQL query returns some incorrect result: it returns that the classes adult, person, and male are equivalent to class man (i.e., this part is correct), but they are also equivalent classes to all other classes in my OWL file such as haulage_worker, which is incorrect. Here is my SPARQL query: PREFIX abc: <http://owl.cs.manchester.ac.uk/2009/07/sssw/people#> PREFIX ghi: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX mno: <http://www.w3.org/2001/XMLSchema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX list: <http://jena.hpl.hp.com/ARQ/list#> SELECT Distinct ?class ?equivalentClass WHERE{ ?class a owl:Class . FILTER( STRSTARTS(STR(?class),"http://www.w3.org/2002/07/owl#") || STRSTARTS(STR(?class),"http://owl.cs.manchester.ac.uk/2009/07/sssw/people#") ) ?x a owl:Class ; owl:intersectionOf ?list . ?list rdf:rest*/rdf:first ?equivalentClass . } GROUP BY ?class ?equivalentClass ORDER BY ?no and this is my OWL file: <?xml version="1.0"?> <rdf:RDF xmlns="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:ns0="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#" xml:base="http://owl.cs.manchester.ac.uk/2009/07/sssw/people"> <owl:Ontology rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people"/> <owl:Class rdf:about="http://www.w3.org/2002/07/owl#Thing"/> <owl:Class rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#haulage_worker"> <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string" ></rdfs:comment> <owl:equivalentClass> <owl:Restriction> <owl:onProperty> <owl:ObjectProperty rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#works_for"/> </owl:onProperty> <owl:someValuesFrom> <owl:Class> <owl:unionOf rdf:parseType="Collection"> <owl:Restriction> <owl:onProperty> <owl:ObjectProperty rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#part_of"/> </owl:onProperty> <owl:someValuesFrom> <owl:Class rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#haulage_company"/> </owl:someValuesFrom> </owl:Restriction> <owl:Class rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#haulage_company"/> </owl:unionOf> </owl:Class> </owl:someValuesFrom> </owl:Restriction> </owl:equivalentClass> <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >haulage worker</rdfs:label> </owl:Class> <owl:Class rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#man"> <owl:equivalentClass> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#adult"/> <owl:Class rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#person"/> <owl:Class rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#male"/> </owl:intersectionOf> </owl:Class> </owl:equivalentClass> </owl:Class> </rdf:RDF> This is the output which I got (they are not correct output): ----------------------------------------- | class | equivalentClass | ========================================= | abc:adult | abc:adult | | abc:adult | abc:male | | abc:adult | abc:person | | abc:haulage_company | abc:adult | | abc:haulage_company | abc:male | | abc:haulage_company | abc:person | | abc:haulage_worker | abc:adult | | abc:haulage_worker | abc:male | | abc:haulage_worker | abc:person | | abc:male | abc:adult | | abc:male | abc:male | | abc:male | abc:person | | abc:man | abc:adult | | abc:man | abc:male | | abc:man | abc:person | | abc:person | abc:adult | | abc:person | abc:male | | abc:person | abc:person | | owl:Thing | abc:adult | | owl:Thing | abc:male | | owl:Thing | abc:person | ----------------------------------------- The expected output would be like this: ----------------------------------------- | class | equivalentClass | ========================================= | abc:adult | abc:adult | | abc:adult | abc:male | | abc:adult | abc:person | | abc:haulage_company | | | abc:haulage_company | | | abc:haulage_company | | | abc:haulage_worker | | | abc:haulage_worker | | | abc:haulage_worker | | | abc:male | abc:adult | | abc:male | abc:male | | abc:male | abc:person | | abc:man | abc:adult | | abc:man | abc:male | | abc:man | abc:person | | abc:person | abc:adult | | abc:person | abc:male | | abc:person | abc:person | | owl:Thing | | | owl:Thing | | | owl:Thing | | ----------------------------------------- What should I change in my SPARQL query in order to make my output like the previous table?
Cleaning up your query a bit, we have: prefix abc: <http://owl.cs.manchester.ac.uk/2009/07/sssw/people#> prefix ghi: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> prefix mno: <http://www.w3.org/2001/XMLSchema#> prefix owl: <http://www.w3.org/2002/07/owl#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> prefix list: <http://jena.hpl.hp.com/ARQ/list#> select distinct ?class ?equivalentClass where { ?class a owl:Class . filter( strstarts(str(?class),str(owl:)) || # since "owl:" is an IRI, you can strstarts(str(?class),str(abc:)) ) # use str(owl:) and str(:abc) ?x a owl:Class ; owl:intersectionOf ?list . ?list rdf:rest*/rdf:first ?equivalentClass . } group by ?class ?equivalentClass order by ?class # ?class, not ?no Your problem lies in that you're selecting ?class, which can be every owl:Class in the ontology (as long as it starts with an appropriate prefix), and then selecting ?equivalentClass from the list of intersection classes of ?x, and ?x has no connection whatsoever to ?class. (You were also sorting by?no, but I think you meant to sort by?class`.) Figuring out the right query to write will be easier if we take a look at the data in a more human readable format, e.g., Turtle. In Turtle, the man class is: ns0:man a owl:Class ; owl:equivalentClass [ a owl:Class ; owl:intersectionOf ( ns0:adult ns0:person ns0:male ) ] . You're looking for things which are owl:Classes, are related by owl:equivalentClass to something else that's an owl:Class, and which has a list value for owl:intersectionOf. This isn't too hard in SPARQL, and the query actually has the same kind of structure as this Turtle text: prefix abc: <http://owl.cs.manchester.ac.uk/2009/07/sssw/people#> prefix ghi: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> prefix mno: <http://www.w3.org/2001/XMLSchema#> prefix owl: <http://www.w3.org/2002/07/owl#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> prefix list: <http://jena.hpl.hp.com/ARQ/list#> select distinct ?class ?otherClass where { ?class a owl:Class ; owl:equivalentClass [ a owl:Class ; owl:intersectionOf [ rdf:rest*/rdf:first ?otherClass ] ] . filter( strstarts(str(?class),str(owl:)) || strstarts(str(?class),str(abc:)) ) } group by ?class ?otherClass order by ?class I changed the variable name from equivalentClass to otherClass, because adult, male, and person aren't equivalent to man. Their intersection is. Using Jena's command line sparql tool, you'll get results like this: $ sparql --data data.rdf --query query.rq ------------------------ | class | otherClass | ======================== | abc:man | abc:adult | | abc:man | abc:male | | abc:man | abc:person | ------------------------ This query only retrieves classes that are equivalent to some intersection. Your expected results showed all the classes whose IRIs started with abc: or owl:, which means that the extra structure is actually optional, so we adjust the query accordingly by wrapping the optional parts in optional { … }, and we get the kind of results we're looking for: prefix abc: <http://owl.cs.manchester.ac.uk/2009/07/sssw/people#> prefix ghi: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> prefix mno: <http://www.w3.org/2001/XMLSchema#> prefix owl: <http://www.w3.org/2002/07/owl#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> prefix list: <http://jena.hpl.hp.com/ARQ/list#> select distinct ?class ?otherClass where { ?class a owl:Class . optional { ?class owl:equivalentClass [ a owl:Class ; owl:intersectionOf [ rdf:rest*/rdf:first ?otherClass ] ] . } filter( strstarts(str(?class),str(owl:)) || strstarts(str(?class),str(abc:)) ) } group by ?class ?otherClass order by ?class $ sparql --data data.rdf --query query.rq ------------------------------------ | class | otherClass | ==================================== | abc:adult | | | abc:haulage_company | | | abc:haulage_worker | | | abc:male | | | abc:man | abc:adult | | abc:man | abc:male | | abc:man | abc:person | | abc:person | | | owl:Thing | | ------------------------------------