Source code for oasislmf.pytools.converters.csvtobin.utils.summarycalc
import numba as nb
import numpy as np
from oasislmf.pytools.common.data import DEFAULT_BUFFER_SIZE
from oasislmf.pytools.common.event_stream import SUMMARY_STREAM_ID
from oasislmf.pytools.converters.csvtobin.utils.common import iter_csv_as_ndarray
from oasislmf.pytools.converters.data import TOOL_INFO
_CHUNK_OUT_SIZE = DEFAULT_BUFFER_SIZE * 7 + 5
@nb.njit(cache=True, error_model="numpy")
def _fill_summarycalc_chunk(event_ids, summary_ids, expvals_i32, sidxs, losses_i32,
max_sample_index, out, pos,
prev_event_id, prev_summary_id, prev_expval_i32):
for i in range(len(event_ids)):
if (event_ids[i] != prev_event_id or summary_ids[i] != prev_summary_id
or expvals_i32[i] != prev_expval_i32):
if prev_event_id != np.int32(-1):
out[pos] = np.int32(0)
out[pos + 1] = np.int32(0)
pos += 2
out[pos] = event_ids[i]
out[pos + 1] = summary_ids[i]
out[pos + 2] = expvals_i32[i]
pos += 3
prev_event_id = event_ids[i]
prev_summary_id = summary_ids[i]
prev_expval_i32 = expvals_i32[i]
if sidxs[i] <= max_sample_index:
out[pos] = sidxs[i]
out[pos + 1] = losses_i32[i]
pos += 2
return pos, prev_event_id, prev_summary_id, prev_expval_i32
[docs]
def summarycalc_tobin(stack, file_in, file_out, file_type, max_sample_index, summary_set_id):
dtype = TOOL_INFO[file_type]["dtype"]
stream_agg_type = 1
stream_info = (SUMMARY_STREAM_ID << 24 | stream_agg_type)
np.array([stream_info], dtype="i4").tofile(file_out)
np.array([max_sample_index], dtype="i4").tofile(file_out)
np.array([summary_set_id], dtype="i4").tofile(file_out)
buf = np.empty(_CHUNK_OUT_SIZE, dtype=np.int32)
prev_event_id = np.int32(-1)
prev_summary_id = np.int32(-1)
prev_expval_i32 = np.int32(-1)
for chunk in iter_csv_as_ndarray(stack, file_in, dtype):
event_ids = np.ascontiguousarray(chunk["EventId"])
summary_ids = np.ascontiguousarray(chunk["SummaryId"])
expvals_i32 = chunk["ImpactedExposure"].astype(np.float32).view(np.int32)
sidxs = np.ascontiguousarray(chunk["SampleId"])
losses_i32 = chunk["Loss"].astype(np.float32).view(np.int32)
pos, prev_event_id, prev_summary_id, prev_expval_i32 = _fill_summarycalc_chunk(
event_ids, summary_ids, expvals_i32, sidxs, losses_i32,
max_sample_index, buf, np.int64(0),
prev_event_id, prev_summary_id, prev_expval_i32
)
buf[:pos].tofile(file_out)
if prev_event_id != np.int32(-1):
np.array([0, 0], dtype=np.int32).tofile(file_out)