@@ -267,6 +267,7 @@ def skims_mapping(
267267 parking_col_name = None ,
268268 zone_layer = None ,
269269 primary_origin_col_name = None ,
270+ predigitized_time_periods = False ,
270271):
271272 logger .info ("loading skims_mapping" )
272273 logger .info (f"- orig_col_name: { orig_col_name } " )
@@ -337,6 +338,10 @@ def skims_mapping(
337338 ),
338339 )
339340 else :
341+ if predigitized_time_periods :
342+ time_rel = "_code ->"
343+ else :
344+ time_rel = " @"
340345 return dict (
341346 # TODO:SHARROW: organize dimensions.
342347 odt_skims = skim_dataset ,
@@ -347,16 +352,16 @@ def skims_mapping(
347352 relationships = (
348353 f"df._orig_col_name -> odt_skims.{ odim } " ,
349354 f"df._dest_col_name -> odt_skims.{ ddim } " ,
350- "df.out_period @ odt_skims.time_period" ,
355+ f "df.out_period{ time_rel } odt_skims.time_period" ,
351356 f"df._dest_col_name -> dot_skims.{ odim } " ,
352357 f"df._orig_col_name -> dot_skims.{ ddim } " ,
353- "df.in_period @ dot_skims.time_period" ,
358+ f "df.in_period{ time_rel } dot_skims.time_period" ,
354359 f"df._orig_col_name -> odr_skims.{ odim } " ,
355360 f"df._dest_col_name -> odr_skims.{ ddim } " ,
356- "df.in_period @ odr_skims.time_period" ,
361+ f "df.in_period{ time_rel } odr_skims.time_period" ,
357362 f"df._dest_col_name -> dor_skims.{ odim } " ,
358363 f"df._orig_col_name -> dor_skims.{ ddim } " ,
359- "df.out_period @ dor_skims.time_period" ,
364+ f "df.out_period{ time_rel } dor_skims.time_period" ,
360365 f"df._orig_col_name -> od_skims.{ odim } " ,
361366 f"df._dest_col_name -> od_skims.{ ddim } " ,
362367 ),
@@ -525,6 +530,15 @@ def new_flow(
525530
526531 cache_dir = state .filesystem .get_sharrow_cache_dir ()
527532 logger .debug (f"flow.cache_dir: { cache_dir } " )
533+ predigitized_time_periods = False
534+ if "out_period" in choosers and "in_period" in choosers :
535+ if (
536+ choosers ["out_period" ].dtype == "category"
537+ and choosers ["in_period" ].dtype == "category"
538+ ):
539+ choosers ["out_period_code" ] = choosers ["out_period" ].cat .codes
540+ choosers ["in_period_code" ] = choosers ["in_period" ].cat .codes
541+ predigitized_time_periods = True
528542 skims_mapping_ = skims_mapping (
529543 state ,
530544 orig_col_name ,
@@ -534,6 +548,7 @@ def new_flow(
534548 parking_col_name = parking_col_name ,
535549 zone_layer = zone_layer ,
536550 primary_origin_col_name = primary_origin_col_name ,
551+ predigitized_time_periods = predigitized_time_periods ,
537552 )
538553 if size_term_mapping is None :
539554 size_term_mapping = {}
@@ -774,6 +789,9 @@ def apply_flow(
774789 it ever again, but having a reference to it available later can be useful
775790 in debugging and tracing. Flows are cached and reused anyway, so it is
776791 generally not important to delete this at any point to free resources.
792+ tree : sharrow.DataTree
793+ The tree data used to compute the flow result. It is seperate from the
794+ flow to prevent it from being cached with the flow.
777795 """
778796 if sh is None :
779797 return None , None
@@ -800,7 +818,7 @@ def apply_flow(
800818 logger .error (f"error in apply_flow: { err !s} " )
801819 if required :
802820 raise
803- return None , None
821+ return None , None , None
804822 else :
805823 raise
806824 with logtime (f"{ flow .name } .load" , trace_label or "" ):
@@ -822,7 +840,9 @@ def apply_flow(
822840 logger .error (f"error in apply_flow: { err !s} " )
823841 if required :
824842 raise
825- return None , flow
843+ tree = flow .tree
844+ flow .tree = None
845+ return None , flow , tree
826846 raise
827847 except Exception as err :
828848 logger .error (f"error in apply_flow: { err !s} " )
@@ -833,4 +853,6 @@ def apply_flow(
833853 # Detecting compilation activity when in production mode is a bug
834854 # that should be investigated.
835855 tracing .timing_notes .add (f"compiled:{ flow .name } " )
836- return flow_result , flow
856+ tree = flow .tree
857+ flow .tree = None
858+ return flow_result , flow , tree
0 commit comments