1- use std:: { collections:: HashMap , io, path:: Path } ;
1+ use std:: {
2+ collections:: HashMap ,
3+ ffi:: CString ,
4+ io,
5+ path:: { Path , PathBuf } ,
6+ } ;
27
38use egg:: { Id , RecExpr } ;
49
510use crate :: {
6- plan:: Plan ,
11+ eval:: LAGraph_MMRead ,
12+ plan:: { LabelMeta , Plan } ,
713 query:: { Pattern , Query , Vertex } ,
814} ;
915
1016pub struct Graph {
1117 nvals : HashMap < String , usize > ,
18+ pub mats : HashMap < String , * mut libc:: c_void > ,
19+ pub verts : HashMap < String , usize > ,
1220}
1321
1422impl Graph {
15- fn plan_aux ( & self , expr : & mut RecExpr < Plan > , pattern : Pattern ) -> Id {
23+ fn plan_aux ( & self , expr : & mut RecExpr < Plan > , pattern : Pattern ) -> Result < Id , String > {
1624 match pattern {
1725 Pattern :: Uri ( uri) => Ok ( expr. add ( Plan :: Label ( LabelMeta {
1826 nvals : * self
@@ -22,50 +30,65 @@ impl Graph {
2230 name : uri,
2331 } ) ) ) ,
2432 Pattern :: Seq ( lhs, rhs) => {
25- let lhs = self . plan_aux ( expr, * lhs) ;
26- let rhs = self . plan_aux ( expr, * rhs) ;
27- expr. add ( Plan :: Seq ( [ lhs, rhs] ) )
33+ let lhs = self . plan_aux ( expr, * lhs) ? ;
34+ let rhs = self . plan_aux ( expr, * rhs) ? ;
35+ Ok ( expr. add ( Plan :: Seq ( [ lhs, rhs] ) ) )
2836 }
2937 Pattern :: Alt ( lhs, rhs) => {
30- let lhs = self . plan_aux ( expr, * lhs) ;
31- let rhs = self . plan_aux ( expr, * rhs) ;
32- expr. add ( Plan :: Alt ( [ lhs, rhs] ) )
38+ let lhs = self . plan_aux ( expr, * lhs) ? ;
39+ let rhs = self . plan_aux ( expr, * rhs) ? ;
40+ Ok ( expr. add ( Plan :: Alt ( [ lhs, rhs] ) ) )
3341 }
3442 Pattern :: Star ( lhs) => {
35- let lhs = self . plan_aux ( expr, * lhs) ;
36- expr. add ( Plan :: Star ( [ lhs] ) )
43+ let lhs = self . plan_aux ( expr, * lhs) ? ;
44+ Ok ( expr. add ( Plan :: Star ( [ lhs] ) ) )
3745 }
3846 Pattern :: Plus ( lhs) => {
39- let lhs = self . plan_aux ( expr, * lhs) ;
47+ let lhs = self . plan_aux ( expr, * lhs) ? ;
4048 let aux = expr. add ( Plan :: Star ( [ lhs] ) ) ;
41- expr. add ( Plan :: Seq ( [ lhs, aux] ) )
49+ Ok ( expr. add ( Plan :: Seq ( [ lhs, aux] ) ) )
50+ }
51+ Pattern :: Opt ( _lhs) => {
52+ todo ! ( "opt (?) queries are not supported yet" )
4253 }
43- _ => todo ! ( "TBD" ) ,
4454 }
4555 }
4656
47- pub fn run ( & self , query : Query ) -> RecExpr < Plan > {
57+ pub fn run ( & self , query : Query ) -> Result < RecExpr < Plan > , String > {
4858 let mut expr: RecExpr < Plan > = RecExpr :: default ( ) ;
4959 match query {
5060 Query {
51- src : Vertex :: Con ( _v) ,
61+ src : Vertex :: Any ,
62+ pattern,
63+ dest : Vertex :: Any ,
64+ } => self . plan_aux ( & mut expr, pattern) ?,
65+ Query {
66+ src : Vertex :: Con ( name) ,
5267 pattern,
5368 dest : Vertex :: Any ,
5469 } => {
55- // TODO: add src vertex knowledge.
56- self . plan_aux ( & mut expr, pattern)
70+ let lhs = expr. add ( Plan :: Label ( LabelMeta { name, nvals : 1 } ) ) ;
71+ let rhs = self . plan_aux ( & mut expr, pattern) ?;
72+ expr. add ( Plan :: Seq ( [ lhs, rhs] ) )
5773 }
5874 Query {
5975 src : Vertex :: Any ,
6076 pattern,
61- dest : Vertex :: Con ( _v) ,
77+ dest : Vertex :: Con ( name) ,
78+ } => {
79+ let lhs = self . plan_aux ( & mut expr, pattern) ?;
80+ let rhs = expr. add ( Plan :: Label ( LabelMeta { name, nvals : 1 } ) ) ;
81+ expr. add ( Plan :: Seq ( [ lhs, rhs] ) )
82+ }
83+ Query {
84+ src : Vertex :: Con ( _v1) ,
85+ pattern : _,
86+ dest : Vertex :: Con ( _v2) ,
6287 } => {
63- // TODO: add dest vertex knowledge.
64- self . plan_aux ( & mut expr, pattern)
88+ todo ! ( "con to con queries are not supported yet" )
6589 }
66- _ => todo ! ( "TBD" ) ,
6790 } ;
68- expr
91+ Ok ( expr)
6992 }
7093}
7194
@@ -84,16 +107,36 @@ pub fn load_dir(path: &Path) -> io::Result<Graph> {
84107 } )
85108 . collect ( ) ;
86109
87- let nvals: HashMap < String , usize > = dirs
110+ let verts_file = path. join ( "vertices.txt" ) ;
111+ let verts: HashMap < String , usize > = std:: fs:: read_to_string ( verts_file) ?
112+ . lines ( )
113+ . filter_map ( |line| {
114+ let mut splits = line. split_whitespace ( ) ;
115+ let vert = splits. next ( ) ?;
116+ let vert = vert[ 1 ..vert. len ( ) - 1 ] . to_string ( ) ;
117+ let num = splits. next ( ) ?. parse :: < usize > ( ) . ok ( ) ?;
118+ Some ( ( vert, num) )
119+ } )
120+ . collect ( ) ;
121+
122+ let mat_files: Vec < ( String , PathBuf ) > = dirs
88123 . flatten ( )
89124 . map ( |entry| entry. path ( ) )
90125 . filter_map ( |entry| Some ( entry. file_stem ( ) ?. to_str ( ) ?. to_string ( ) ) )
91126 . filter_map ( |entry| entry. parse :: < usize > ( ) . ok ( ) )
92127 . filter_map ( |entry| {
93- let edge = edges. get ( & entry) ?;
94- let edge_file = path. join ( format ! ( "{}.txt" , entry) ) ;
128+ Some ( (
129+ edges. get ( & entry) ?. clone ( ) ,
130+ path. join ( format ! ( "{}.txt" , entry) ) ,
131+ ) )
132+ } )
133+ . collect ( ) ;
134+
135+ let nvals: HashMap < String , usize > = mat_files
136+ . iter ( )
137+ . filter_map ( |( edge, file) | {
95138 // TODO: read only first 3 lines :/.
96- let edge_nvals = std:: fs:: read_to_string ( edge_file )
139+ let edge_nvals = std:: fs:: read_to_string ( file )
97140 . ok ( ) ?
98141 . lines ( )
99142 . nth ( 2 ) ?
@@ -106,5 +149,28 @@ pub fn load_dir(path: &Path) -> io::Result<Graph> {
106149 } )
107150 . collect ( ) ;
108151
109- Ok ( Graph { nvals } )
152+ let mats: HashMap < String , * mut libc:: c_void > = mat_files
153+ . iter ( )
154+ . map ( |( edge, file) | {
155+ let mut mat: * mut libc:: c_void = std:: ptr:: null_mut ( ) ;
156+ unsafe {
157+ let c_file = CString :: new ( file. to_str ( ) . unwrap ( ) ) . unwrap ( ) ;
158+ let mode = CString :: new ( "r" ) . unwrap ( ) ;
159+ let f = libc:: fopen ( c_file. as_ptr ( ) , mode. as_ptr ( ) ) ;
160+ let code =
161+ LAGraph_MMRead ( & mut mat as * mut * mut libc:: c_void , f, std:: ptr:: null_mut ( ) ) ;
162+ assert_eq ! (
163+ code,
164+ 0 ,
165+ "unable to load matrix for {} in {} (error {})" ,
166+ edge,
167+ file. display( ) ,
168+ code
169+ ) ;
170+ } ;
171+ ( edge. clone ( ) , mat)
172+ } )
173+ . collect ( ) ;
174+
175+ Ok ( Graph { nvals, mats, verts } )
110176}
0 commit comments