Skip to content

Commit 74115e8

Browse files
author
Binh Vu
committed
support shapefile, customize drepr resources and updating climate example
1 parent a1d7339 commit 74115e8

29 files changed

+1418
-391
lines changed

drepr/Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

drepr/engine/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
22
[package]
33
name = "engine"
4-
version = "1.0.6" # ___PKG_VERSION___: DO NOT MODIFY the version here. Update it via version_manager.py!
4+
version = "1.0.7" # ___PKG_VERSION___: DO NOT MODIFY the version here. Update it via version_manager.py!
55
authors = ["Binh Vu <[email protected]>"]
66
edition = "2018"
77

drepr/engine/src/lang/resource.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,13 @@ pub enum Resource {
1313
#[serde(rename = "netcdf4")]
1414
NetCDF4(usize),
1515
#[serde(rename = "np-dict")]
16-
NPDict(usize)
16+
NPDict(usize),
17+
#[serde(rename = "geotiff")]
18+
GeoTIFF(usize),
19+
#[serde(rename = "shapefile")]
20+
Shapefile(usize),
21+
#[serde(rename = "container")]
22+
Container(usize)
1723
}
1824

1925
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]

pydrepr/drepr/executors/cf_convention_map/cf_convention_map.py

+33-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from drepr.executors.readers.geotiff import GeoTIFFReader
22
from drepr.executors.readers.netcdf import NetCDF4Reader
33
from drepr.executors.readers.np_dict import NPDictReader
4+
from drepr.executors.readers.reader_container import ReaderContainer
5+
from drepr.executors.readers.shapefile import ShapefileReader
46
from drepr.models import DRepr, ResourceType, RangeAlignment, PMap
57
import numpy as np
68

@@ -56,6 +58,10 @@ def execute(cls, ds_model: DRepr, resource_file: str):
5658
reader = GeoTIFFReader.from_file(resource_file)
5759
elif resource.type == ResourceType.NPDict:
5860
reader = NPDictReader.from_file(resource_file)
61+
elif resource.type == ResourceType.Shapefile:
62+
reader = ShapefileReader.from_file(resource_file)
63+
elif resource.type == ResourceType.Container:
64+
reader = ReaderContainer.get_instance().get(resource_file)
5965
else:
6066
raise NotImplementedError()
6167

@@ -64,12 +70,32 @@ def execute(cls, ds_model: DRepr, resource_file: str):
6470
for preprocess_fn in ds_model.preprocessing:
6571
if preprocess_fn.type == PreprocessingType.pmap:
6672
steps = preprocess_fn.value.path.steps
67-
assert all(isinstance(step, IndexExpr) for step in steps), "Range selection should use numpy map"
68-
69-
index = [step.val for step in steps]
73+
n_range_exprs = sum(int(not isinstance(step, IndexExpr)) for step in steps)
7074
fn = PyExec.compile(preprocess_fn.value.code)
71-
value = fn.exec(reader.get_value(index), index, context)
72-
reader.set_value(index, value)
75+
76+
if n_range_exprs == 0:
77+
index = [step.val for step in steps]
78+
value = fn.exec(reader.get_value(index), index, context)
79+
reader.set_value(index, value)
80+
else:
81+
# TODO: improve it
82+
range_indices = [i for i in range(len(steps)) if isinstance(steps[i], RangeExpr)]
83+
index = [step.start if isinstance(step, RangeExpr) else step.val for step in steps]
84+
if n_range_exprs == 1:
85+
range_idx = range_indices[0]
86+
if steps[range_idx].end is None:
87+
if range_idx == 0:
88+
end = reader.len_range()
89+
else:
90+
end = len(reader.get_value(index[:range_idx]))
91+
else:
92+
end = steps[range_idx].end
93+
for i in range(steps[range_idx].start, end, steps[range_idx].step):
94+
index[range_idx] = i
95+
value = fn.exec(reader.get_value(index), index, context)
96+
reader.set_value(index, value)
97+
else:
98+
raise NotImplementedError()
7399
else:
74100
raise Exception("You found a bug")
75101

@@ -100,8 +126,10 @@ def execute(cls, ds_model: DRepr, resource_file: str):
100126
count += 1
101127
else:
102128
step2dim.append(None)
129+
103130
new_attrs[f"dnode:{attr.id}"] = ArrayAttr(f"dnode:{attr.id}", attrs[attr.id], path, step2dim, nodata)
104131
else:
132+
# TODO: this is wrong if the value are the list!
105133
new_attrs[f"dnode:{attr.id}"] = ScalarAttr(f"dnode:{attr.id}", attrs[attr.id])
106134
# assert all(isinstance(step, IndexExpr) for step in attr.path.steps)
107135
# index = [step.val for step in steps]

pydrepr/drepr/executors/cf_convention_map/geotiff_map.py

-110
This file was deleted.

pydrepr/drepr/executors/cf_convention_map/netcdf_map.py

-100
This file was deleted.

pydrepr/drepr/executors/readers/geotiff.py

+3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ def from_file(cls, infile: str):
3131
def len(self) -> int:
3232
return self.data.shape[0] + 1
3333

34+
def len_range(self) -> int:
35+
return self.data.shape[0]
36+
3437
def select(self, steps: List[Union[IndexExpr, RangeExpr]]):
3538
if isinstance(steps[0], IndexExpr) and steps[0].val == '@':
3639
# select metadata

pydrepr/drepr/executors/readers/netcdf.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ def len(self) -> int:
4040
# count the global metadata at '@'
4141
return len(self.dataset.variables.keys()) + 1
4242

43+
def len_range(self) -> int:
44+
raise Exception("Error in your drepr model")
45+
4346
def get_value(self, index: List[Index]):
4447
if index[0] == '@':
4548
# read metadata
@@ -71,7 +74,6 @@ def set_value(self, index: List[Index], value):
7174
ptr = ptr[index[i]]
7275
ptr[index[-1]] = value
7376

74-
7577
def select(self, steps: List[Union[IndexExpr, RangeExpr]]):
7678
# steps.0 must be index because there is no structure change
7779
assert isinstance(steps[0], IndexExpr)

pydrepr/drepr/executors/readers/np_dict.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,7 @@ def select(self, steps: List[Union[IndexExpr, RangeExpr]]):
3333
return self.data[steps[0].val]
3434

3535
def len(self) -> int:
36-
return len(self.data)
36+
return len(self.data)
37+
38+
def len_range(self) -> int:
39+
raise Exception("Error in your drepr model")

pydrepr/drepr/executors/readers/ra_reader.py

+7
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,10 @@ def len(self) -> int:
3535
Get length of the current node.
3636
"""
3737
pass
38+
39+
@abstractmethod
40+
def len_range(self) -> int:
41+
"""
42+
Get length of the current node (range only).
43+
"""
44+
pass
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from typing import List, Dict, Tuple, Callable, Any, Optional
2+
3+
from drepr.executors.readers.ra_reader import NDArrayReader
4+
5+
6+
class ReaderContainer:
7+
"""
8+
This contains the list of ndarray reader that can be injected by the users so that they can extend the
9+
coverage of the system
10+
"""
11+
instance = None
12+
13+
def __init__(self):
14+
self.readers = {}
15+
16+
@staticmethod
17+
def get_instance():
18+
if ReaderContainer.instance is None:
19+
ReaderContainer.instance = ReaderContainer()
20+
return ReaderContainer.instance
21+
22+
def set(self, reader_id: str, reader: NDArrayReader):
23+
self.readers[reader_id] = reader
24+
25+
def get(self, reader_id: str):
26+
return self.readers[reader_id]

0 commit comments

Comments
 (0)