palimpzest 1.0.0__py3-none-any.whl → 1.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,6 +11,11 @@ from palimpzest.core.lib.schemas import create_schema_from_fields
11
11
  # - construct the correct output schema using the input schema and the group by and aggregation fields
12
12
  # - remove/update all other references to GroupBySig in the codebase
13
13
 
14
+ # TODO:
15
+ # - move the arguments for group_by_fields, agg_funcs, and agg_fields into the Dataset.groupby() operator
16
+ # - construct the correct output schema using the input schema and the group by and aggregation fields
17
+ # - remove/update all other references to GroupBySig in the codebase
18
+
14
19
  # signature for a group by aggregate that applies
15
20
  # group and aggregation to an input tuple
16
21
  class GroupBySig:
palimpzest/core/models.py CHANGED
@@ -454,6 +454,12 @@ class BasePlanStats(BaseModel):
454
454
  """
455
455
  return sum([gen_stats.total_output_tokens for _, gen_stats in self.validation_gen_stats.items()])
456
456
 
457
+ def get_total_cost_so_far(self) -> float:
458
+ """
459
+ Get the total cost incurred so far in this plan execution.
460
+ """
461
+ return self.sum_op_costs() + self.sum_validation_costs()
462
+
457
463
 
458
464
  class PlanStats(BasePlanStats):
459
465
  """
@@ -82,10 +82,11 @@ class SentinelExecutionStrategy(BaseExecutionStrategy, ABC):
82
82
  """
83
83
  def __init__(
84
84
  self,
85
- k: int,
86
- j: int,
87
- sample_budget: int,
88
85
  policy: Policy,
86
+ k: int = 6,
87
+ j: int = 4,
88
+ sample_budget: int = 100,
89
+ sample_cost_budget: float | None = None,
89
90
  priors: dict | None = None,
90
91
  use_final_op_quality: bool = False,
91
92
  seed: int = 42,
@@ -97,6 +98,7 @@ class SentinelExecutionStrategy(BaseExecutionStrategy, ABC):
97
98
  self.k = k
98
99
  self.j = j
99
100
  self.sample_budget = sample_budget
101
+ self.sample_cost_budget = sample_cost_budget
100
102
  self.policy = policy
101
103
  self.priors = priors
102
104
  self.use_final_op_quality = use_final_op_quality
@@ -680,6 +680,9 @@ class MABExecutionStrategy(SentinelExecutionStrategy):
680
680
 
681
681
  return max_quality_op
682
682
 
683
+ def _compute_termination_condition(self, samples_drawn: int, sampling_cost: float) -> bool:
684
+ return (samples_drawn >= self.sample_budget) if self.sample_cost_budget is None else (sampling_cost >= self.sample_cost_budget)
685
+
683
686
  def _execute_sentinel_plan(
684
687
  self,
685
688
  plan: SentinelPlan,
@@ -688,8 +691,8 @@ class MABExecutionStrategy(SentinelExecutionStrategy):
688
691
  plan_stats: SentinelPlanStats,
689
692
  ) -> SentinelPlanStats:
690
693
  # sample records and operators and update the frontiers
691
- samples_drawn = 0
692
- while samples_drawn < self.sample_budget:
694
+ samples_drawn, sampling_cost = 0, 0.0
695
+ while not self._compute_termination_condition(samples_drawn, sampling_cost):
693
696
  # pre-compute the set of source indices which will need to be sampled
694
697
  source_indices_to_sample = set()
695
698
  for op_frontier in op_frontiers.values():
@@ -732,6 +735,9 @@ class MABExecutionStrategy(SentinelExecutionStrategy):
732
735
  }
733
736
  source_indices_to_all_record_sets, val_gen_stats = self._score_quality(validator, source_indices_to_all_record_sets)
734
737
 
738
+ # update the progress manager with validation cost
739
+ self.progress_manager.incr_overall_progress_cost(val_gen_stats.cost_per_record)
740
+
735
741
  # remove records that were read from the execution cache before adding to record op stats
736
742
  new_record_op_stats = []
737
743
  for _, record_set_tuples in source_indices_to_record_set_tuples.items():
@@ -742,6 +748,7 @@ class MABExecutionStrategy(SentinelExecutionStrategy):
742
748
  # update plan stats
743
749
  plan_stats.add_record_op_stats(unique_logical_op_id, new_record_op_stats)
744
750
  plan_stats.add_validation_gen_stats(unique_logical_op_id, val_gen_stats)
751
+ sampling_cost = plan_stats.get_total_cost_so_far()
745
752
 
746
753
  # provide the best record sets as inputs to the next logical operator
747
754
  next_unique_logical_op_id = plan.get_next_unique_logical_op_id(unique_logical_op_id)
@@ -813,7 +820,7 @@ class MABExecutionStrategy(SentinelExecutionStrategy):
813
820
  op_frontiers[unique_logical_op_id] = OpFrontier(op_set, source_unique_logical_op_ids, root_dataset_ids, source_indices, self.k, self.j, self.seed, self.policy, self.priors)
814
821
 
815
822
  # initialize and start the progress manager
816
- self.progress_manager = create_progress_manager(plan, sample_budget=self.sample_budget, progress=self.progress)
823
+ self.progress_manager = create_progress_manager(plan, sample_budget=self.sample_budget, sample_cost_budget=self.sample_cost_budget, progress=self.progress)
817
824
  self.progress_manager.start()
818
825
 
819
826
  # NOTE: we must handle progress manager outside of _execute_sentinel_plan to ensure that it is shut down correctly;
@@ -338,7 +338,7 @@ class Generator(Generic[ContextType, InputType]):
338
338
  reasoning_effort = "minimal" if self.reasoning_effort is None else self.reasoning_effort
339
339
  completion_kwargs = {"reasoning_effort": reasoning_effort, **completion_kwargs}
340
340
  if self.model.is_vllm_model():
341
- completion_kwargs = {"api_base": self.api_base, "api_key": os.environ.get("VLLM_API_KEY", "fake-api-key") **completion_kwargs}
341
+ completion_kwargs = {"api_base": self.api_base, "api_key": os.environ.get("VLLM_API_KEY", "fake-api-key"), **completion_kwargs}
342
342
  completion = litellm.completion(model=self.model_name, messages=messages, **completion_kwargs)
343
343
  end_time = time.time()
344
344
  logger.debug(f"Generated completion in {end_time - start_time:.2f} seconds")
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import time
4
+ from typing import Any
4
5
 
5
6
  from numpy import dot
6
7
  from numpy.linalg import norm
@@ -153,8 +154,8 @@ class RAGConvert(LLMConvert):
153
154
  field = candidate.get_field_type(field_name)
154
155
 
155
156
  # skip this field if it is not a string or a list of strings
156
- is_string_field = field.annotation in [str, str | None]
157
- is_list_string_field = field.annotation in [list[str], list[str] | None]
157
+ is_string_field = field.annotation in [str, str | None, str | Any]
158
+ is_list_string_field = field.annotation in [list[str], list[str] | None, list[str] | Any]
158
159
  if not (is_string_field or is_list_string_field):
159
160
  continue
160
161
 
@@ -358,8 +359,8 @@ class RAGFilter(LLMFilter):
358
359
  field = candidate.get_field_type(field_name)
359
360
 
360
361
  # skip this field if it is not a string or a list of strings
361
- is_string_field = field.annotation in [str, str | None]
362
- is_list_string_field = field.annotation in [list[str], list[str] | None]
362
+ is_string_field = field.annotation in [str, str | None, str | Any]
363
+ is_list_string_field = field.annotation in [list[str], list[str] | None, list[str] | Any]
363
364
  if not (is_string_field or is_list_string_field):
364
365
  continue
365
366
 
@@ -44,6 +44,7 @@ class QueryProcessorConfig(BaseModel):
44
44
  k: int = Field(default=6)
45
45
  j: int = Field(default=4)
46
46
  sample_budget: int = Field(default=100)
47
+ sample_cost_budget: float | None = Field(default=None)
47
48
  seed: int = Field(default=42)
48
49
  exp_name: str | None = Field(default=None)
49
50
  priors: dict | None = Field(default=None)
@@ -283,7 +283,7 @@ class PZProgressManager(ProgressManager):
283
283
  self.unique_full_op_id_to_stats[unique_full_op_id].memory_usage_mb = get_memory_usage()
284
284
 
285
285
  class PZSentinelProgressManager(ProgressManager):
286
- def __init__(self, plan: SentinelPlan, sample_budget: int):
286
+ def __init__(self, plan: SentinelPlan, sample_budget: int | None, sample_cost_budget: float | None):
287
287
  # overall progress bar
288
288
  self.overall_progress = RichProgress(
289
289
  SpinnerColumn(),
@@ -298,7 +298,9 @@ class PZSentinelProgressManager(ProgressManager):
298
298
  refresh_per_second=10,
299
299
  expand=True, # Use full width
300
300
  )
301
- self.overall_task_id = self.overall_progress.add_task("", total=sample_budget, cost=0.0, recent="")
301
+ self.use_cost_budget = sample_cost_budget is not None
302
+ total = sample_cost_budget if self.use_cost_budget else sample_budget
303
+ self.overall_task_id = self.overall_progress.add_task("", total=total, cost=0.0, recent="")
302
304
 
303
305
  # logical operator progress bars
304
306
  self.op_progress = RichProgress(
@@ -334,6 +336,9 @@ class PZSentinelProgressManager(ProgressManager):
334
336
  # initialize start time
335
337
  self.start_time = None
336
338
 
339
+ # initialize validation cost
340
+ self.validation_cost = 0.0
341
+
337
342
  # add a task to the progress manager for each operator in the plan
338
343
  for topo_idx, (logical_op_id, op_set) in enumerate(plan):
339
344
  unique_logical_op_id = f"{topo_idx}-{logical_op_id}"
@@ -387,15 +392,34 @@ class PZSentinelProgressManager(ProgressManager):
387
392
  # start progress bars
388
393
  self.live_display.start()
389
394
 
395
+ def incr_overall_progress_cost(self, cost_delta: float):
396
+ """Advance the overall progress bar by the given cost delta"""
397
+ self.validation_cost += cost_delta
398
+ self.overall_progress.update(
399
+ self.overall_task_id,
400
+ advance=cost_delta,
401
+ cost=sum(stats.total_cost for _, stats in self.unique_logical_op_id_to_stats.items()) + self.validation_cost,
402
+ refresh=True,
403
+ )
404
+
405
+ # force the live display to refresh
406
+ self.live_display.refresh()
407
+
390
408
  def incr(self, unique_logical_op_id: str, num_samples: int, display_text: str | None = None, **kwargs):
391
409
  # TODO: (above) organize progress bars into a Live / Table / Panel or something
392
410
  # get the task for the given operation
393
411
  task = self.unique_logical_op_id_to_task.get(unique_logical_op_id)
394
412
 
413
+ # store the cost before updating stats
414
+ previous_total_cost = self.unique_logical_op_id_to_stats[unique_logical_op_id].total_cost
415
+
395
416
  # update statistics with any additional keyword arguments
396
417
  if kwargs != {}:
397
418
  self.update_stats(unique_logical_op_id, **kwargs)
398
419
 
420
+ # compute the cost delta
421
+ cost_delta = self.unique_logical_op_id_to_stats[unique_logical_op_id].total_cost - previous_total_cost
422
+
399
423
  # update progress bar and recent text in one update
400
424
  if display_text is not None:
401
425
  self.unique_logical_op_id_to_stats[unique_logical_op_id].recent_text = display_text
@@ -414,10 +438,11 @@ class PZSentinelProgressManager(ProgressManager):
414
438
  )
415
439
 
416
440
  # advance the overall progress bar
441
+ advance = cost_delta if self.use_cost_budget else num_samples
417
442
  self.overall_progress.update(
418
443
  self.overall_task_id,
419
- advance=num_samples,
420
- cost=sum(stats.total_cost for _, stats in self.unique_logical_op_id_to_stats.items()),
444
+ advance=advance,
445
+ cost=sum(stats.total_cost for _, stats in self.unique_logical_op_id_to_stats.items()) + self.validation_cost,
421
446
  refresh=True,
422
447
  )
423
448
 
@@ -451,6 +476,7 @@ def create_progress_manager(
451
476
  plan: PhysicalPlan | SentinelPlan,
452
477
  num_samples: int | None = None,
453
478
  sample_budget: int | None = None,
479
+ sample_cost_budget: float | None = None,
454
480
  progress: bool = True,
455
481
  ) -> ProgressManager:
456
482
  """Factory function to create appropriate progress manager based on environment"""
@@ -458,7 +484,7 @@ def create_progress_manager(
458
484
  return MockProgressManager(plan, num_samples)
459
485
 
460
486
  if isinstance(plan, SentinelPlan):
461
- assert sample_budget is not None, "Sample budget must be specified for SentinelPlan progress manager"
462
- return PZSentinelProgressManager(plan, sample_budget)
487
+ assert sample_budget is not None or sample_cost_budget is not None, "Sample budget must be specified for SentinelPlan progress manager"
488
+ return PZSentinelProgressManager(plan, sample_budget, sample_cost_budget)
463
489
 
464
490
  return PZProgressManager(plan, num_samples)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: palimpzest
3
- Version: 1.0.0
3
+ Version: 1.1.0
4
4
  Summary: Palimpzest is a system which enables anyone to process AI-powered analytical queries simply by defining them in a declarative language
5
5
  Author-email: MIT DSG Semantic Management Lab <michjc@csail.mit.edu>
6
6
  Project-URL: homepage, https://palimpzest.org
@@ -5,7 +5,7 @@ palimpzest/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
5
5
  palimpzest/agents/compute_agents.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  palimpzest/agents/search_agents.py,sha256=t2QMreB5Ph71aoNk5bBtV-0l8im79z-pMAR3JDAySDw,29418
7
7
  palimpzest/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- palimpzest/core/models.py,sha256=JT2-yGotYQZVdKXY1jzSONerjo-lK1pH_6KHuvtvY3c,42485
8
+ palimpzest/core/models.py,sha256=FKyKW9PqmqpnDGWOINNT6XgBj0raaAskxtdNdFZ4Zyw,42688
9
9
  palimpzest/core/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  palimpzest/core/data/context.py,sha256=x1xYyu9qW65dvtK_XayIfv_CgsCEPW6Qe0DTiSf9sjU,16207
11
11
  palimpzest/core/data/context_manager.py,sha256=8hAKWD2jhFZgghTu7AYgjkvKDsJUPVxq8g4nG0HWvfo,6150
@@ -14,7 +14,7 @@ palimpzest/core/data/index_dataset.py,sha256=adO67DgzHhA4lBME0-h4SjXfdz9UcNMSDGX
14
14
  palimpzest/core/data/iter_dataset.py,sha256=K47ajOXsCZV3WhOuDkw3xfiHzn8mXPU976uN3SjaP2U,20507
15
15
  palimpzest/core/elements/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  palimpzest/core/elements/filters.py,sha256=fU2x0eWDwfP52_5fUmqJXTuhs4H0vvHtPZLdA3IIw8I,1642
17
- palimpzest/core/elements/groupbysig.py,sha256=uMVYGJGxR0ma1z0wAqlwqOWsUS_TS6XSHx07tm9QMCE,2668
17
+ palimpzest/core/elements/groupbysig.py,sha256=147egmmSXLGc2b62t7Nb8haSVUhN40im6qCXIUI0nPA,2955
18
18
  palimpzest/core/elements/records.py,sha256=jfPmuAcQ2kMx3IlFxg7XClDTVI1mPyq7hcI3trCx2XA,17967
19
19
  palimpzest/core/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  palimpzest/core/lib/schemas.py,sha256=SVWtFAlrggRPmZEGiteCCf5lfRuzHjGdOHWrLnTMFvA,10413
@@ -36,13 +36,13 @@ palimpzest/prompts/validator.py,sha256=OxebGjvXNBy0Cq79XI3aPRbongzOdtHH6mQctpbWc
36
36
  palimpzest/query/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  palimpzest/query/execution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  palimpzest/query/execution/all_sample_execution_strategy.py,sha256=d2MO_AmXF_HbV4rUNkFqHsuoBCofU98zQ-D3Q06BXCc,14369
39
- palimpzest/query/execution/execution_strategy.py,sha256=si3t4uB-QlN8biTfmJJ96XL5iHbTZAhK4gi63v6Qi7A,19046
39
+ palimpzest/query/execution/execution_strategy.py,sha256=PkXtO8wZpv6HHLlpxXwcc0t5pPCGafp0L_iVkG9bmXM,19162
40
40
  palimpzest/query/execution/execution_strategy_type.py,sha256=vRQBPCQN5_aoyD3TLIeW3VPo15mqF-5RBvEXkENz9FE,987
41
- palimpzest/query/execution/mab_execution_strategy.py,sha256=yk9Q4AI6mdO87QHrG41QjReMDzmldoNPUptTyRJUgto,47204
41
+ palimpzest/query/execution/mab_execution_strategy.py,sha256=i03LYRhaG2VLia-XSiYbKdlu3hLQZul75xMcRGm065M,47767
42
42
  palimpzest/query/execution/parallel_execution_strategy.py,sha256=Di-8d7waE0bev4kNDXEJJqQ0wwQ87_sPV-t5qFtAlPQ,17589
43
43
  palimpzest/query/execution/single_threaded_execution_strategy.py,sha256=1rjMel0-AI6KUi_SMNgPPXxMgG5-t9lenLKoYEClgjk,17464
44
44
  palimpzest/query/generators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- palimpzest/query/generators/generators.py,sha256=n8ipeVAfjLA_IbNihr87sMLgU_nuOqnZ4p3Ar9Pfnqo,21757
45
+ palimpzest/query/generators/generators.py,sha256=OV2HBZvCQtvhj6rOwti_8dpQX_bqTZ-uehyUCFG2BBE,21758
46
46
  palimpzest/query/operators/__init__.py,sha256=B9zr_VmUs6YRep4fjbj7e0aTM6T9-GrqbY7tKWxEdkc,4734
47
47
  palimpzest/query/operators/aggregate.py,sha256=nQ6Zh1DYeqDoIDwkPQDw8QCwW0y52sGC-No6uPSRc8A,27367
48
48
  palimpzest/query/operators/compute.py,sha256=X_pWN45smg8L4dV54nOae7dldQGL1nJVlVyJ3ULWSmI,8432
@@ -56,7 +56,7 @@ palimpzest/query/operators/logical.py,sha256=OtB82L1X19ibtLx1GIfeXXyO7YfjkFmh3pu
56
56
  palimpzest/query/operators/mixture_of_agents.py,sha256=KC-ZpjtGY28sfwlk2TpduLC_fADj_UASFCaicaKqSFc,11671
57
57
  palimpzest/query/operators/physical.py,sha256=0_BfFX9nKuN__440eAfEfApWAoGOunVSCZIQxS4HO2Y,9773
58
58
  palimpzest/query/operators/project.py,sha256=gxbjsHEACCP9wxATH-mw6wOSUi5s13JyWsLqqhAYWXQ,2111
59
- palimpzest/query/operators/rag.py,sha256=k2vdthQBNb7FEYX7K1UP9fSQfwK09HNwVJu72ExSsCA,20045
59
+ palimpzest/query/operators/rag.py,sha256=CJm83pBapA8HEGfhRnWjqt_ESS6hJAPvPJksRTOGL7M,20124
60
60
  palimpzest/query/operators/scan.py,sha256=OqCiPRTvTY7SbauNMyFvGT5nRVeRzVsGYSrkoN1Ib_w,7407
61
61
  palimpzest/query/operators/search.py,sha256=cQin-Qc9FT7V0Gv3-pxMLbVMjqE6ALe99V0OrQhA6CI,22711
62
62
  palimpzest/query/operators/split.py,sha256=oLzwnYb8TNf3XA9TMKEAIw7EIA12wHneaD42BNLIHiI,15043
@@ -71,7 +71,7 @@ palimpzest/query/optimizer/primitives.py,sha256=jMMVq37y1tWiPU1lSSKQP9OP-mzkpSxS
71
71
  palimpzest/query/optimizer/rules.py,sha256=awhe76trskv5Tq5E2QHpUN_YV6jH8INywa0Ige8IIhY,53341
72
72
  palimpzest/query/optimizer/tasks.py,sha256=DNJjY2QldfKFWj6INHElMh88dYc36Z5m3wHwbs4jyF4,30455
73
73
  palimpzest/query/processor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
- palimpzest/query/processor/config.py,sha256=kr9UHQ947SJmI77wqomy310mSaKNIMPxh-5k9frMVII,2413
74
+ palimpzest/query/processor/config.py,sha256=MkZ776VUk9tIOCZdVyH__H4Z0gO4c8fpehX2Gqywvks,2472
75
75
  palimpzest/query/processor/query_processor.py,sha256=T4ffPbnOX23G8FDITzmM7Iw7DUEDWIHnwl8XLYllgjg,6240
76
76
  palimpzest/query/processor/query_processor_factory.py,sha256=i9L9StqlUi7m1AqZMuYQWhunqOJi3nLK47skhxq9tIA,8317
77
77
  palimpzest/schemabuilder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -85,12 +85,12 @@ palimpzest/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
85
85
  palimpzest/utils/env_helpers.py,sha256=n81KzoJ459pRxo7QmJA7duazwWsfoMGTHc71D2LatFk,334
86
86
  palimpzest/utils/hash_helpers.py,sha256=3A8dA7SbXTwnnvZvPVNqqMLlVRhCKyKF_bjNNAu3Exk,334
87
87
  palimpzest/utils/model_helpers.py,sha256=X6SlMgD5I5Aj_cxaFaoGaaNvOOqTNZVmjj6zbfn63Yk,2476
88
- palimpzest/utils/progress.py,sha256=GTHUCF77Ja_49wuzRiQrIthaBusGnOrrsZFa4v7HLiM,20758
88
+ palimpzest/utils/progress.py,sha256=eHXrTPTCRHjMdK0EjYRUzSxcV6N1lK8TS3Ju_ZlQLhY,22002
89
89
  palimpzest/utils/udfs.py,sha256=LjHic54B1az-rKgNLur0wOpaz2ko_UodjLEJrazkxvY,1854
90
90
  palimpzest/validator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
91
  palimpzest/validator/validator.py,sha256=SvjK09zCpGtK0yM0OasvQlSzyq3loy32DyOOKRmYXC0,15977
92
- palimpzest-1.0.0.dist-info/licenses/LICENSE,sha256=5GUlHy9lr-Py9kvV38FF1m3yy3NqM18fefuE9wkWumo,1079
93
- palimpzest-1.0.0.dist-info/METADATA,sha256=JtFEnDIpObCPxFO_BHPFj1Rn779GMmc6Xtahz_iNaJw,5359
94
- palimpzest-1.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
95
- palimpzest-1.0.0.dist-info/top_level.txt,sha256=raV06dJUgohefUn3ZyJS2uqp_Y76EOLA9Y2e_fxt8Ew,11
96
- palimpzest-1.0.0.dist-info/RECORD,,
92
+ palimpzest-1.1.0.dist-info/licenses/LICENSE,sha256=5GUlHy9lr-Py9kvV38FF1m3yy3NqM18fefuE9wkWumo,1079
93
+ palimpzest-1.1.0.dist-info/METADATA,sha256=0AZq33WMFrxkarQADVPv2OFQu7ko38fzhBOtTQjc3Fw,5359
94
+ palimpzest-1.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
95
+ palimpzest-1.1.0.dist-info/top_level.txt,sha256=raV06dJUgohefUn3ZyJS2uqp_Y76EOLA9Y2e_fxt8Ew,11
96
+ palimpzest-1.1.0.dist-info/RECORD,,