feat: Add utility tools
I'm hoping to have these be a separate package that are also used in the website.
This commit is contained in:
		
							parent
							
								
									193b86a212
								
							
						
					
					
						commit
						bb0108fb60
					
				
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -3,6 +3,9 @@
 | 
			
		|||
# personal notes
 | 
			
		||||
Notes.md
 | 
			
		||||
 | 
			
		||||
# personal outputs
 | 
			
		||||
packages/utility-tools/input/input-links-*
 | 
			
		||||
 | 
			
		||||
# vim files
 | 
			
		||||
.swp
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,3 +0,0 @@
 | 
			
		|||
{
 | 
			
		||||
  "cSpell.words": ["Stdev"]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								packages/utility-tools/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								packages/utility-tools/README.md
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
## Utility function processor
 | 
			
		||||
 | 
			
		||||
This package contains a series of utilities to work with the utility functions produced by [this utility function extractor](https://utility-function-extractor.quantifieduncertainty.org/openphil-2018-ai-risk)
 | 
			
		||||
 | 
			
		||||
### Merge sort
 | 
			
		||||
 | 
			
		||||
Given a list of elements and a list of utilitity comparisons, sort the list.
 | 
			
		||||
 | 
			
		||||
Gotcha: The list of elements has to be the same list, and in the same order, as that produced when initially doing the comparisons. This is because the merge-sort algorithm depends on the initial order of the list.
 | 
			
		||||
							
								
								
									
										241
									
								
								packages/utility-tools/input/input-links.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								packages/utility-tools/input/input-links.json
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,241 @@
 | 
			
		|||
[
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Stanford University — Machine Learning Security Research Led by Dan Boneh and Florian Tramer",
 | 
			
		||||
 | 
			
		||||
    "target": "Wilson Center — AI Policy Seminar Series",
 | 
			
		||||
 | 
			
		||||
    "distance": 4.039836724233664,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "Jaime's estimates.\nThe Wilson Center seems to not be running the AI Policy Seminar Series anymore, so I am led to believe it was not a great success (?). There could be someone key influenced that will facilitate things later but seems unlikely\nThe ML Security program does not seem to have resulted on anything substantial",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "1 to 10"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Stanford University — Machine Learning Security Research Led by Dan Boneh and Florian Tramer",
 | 
			
		||||
 | 
			
		||||
    "target": "Open Phil AI Fellowship — 2018 Class",
 | 
			
		||||
 | 
			
		||||
    "distance": 657.4661082204123,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "The AI fellows have produced work on interpretability and out of distribution learning.\nSeems to have been better for purchasing influence too, though that's a secondary consideration IMO",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "400 to 1000"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Wilson Center — AI Policy Seminar Series",
 | 
			
		||||
 | 
			
		||||
    "target": "Open Phil AI Fellowship — 2018 Class",
 | 
			
		||||
 | 
			
		||||
    "distance": 403.9836724233662,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "The research seems more directly relevant from the AI fellows, the policy seminar has no legible output",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "100 to 1000"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "UC Berkeley — AI Safety Research (2018)",
 | 
			
		||||
 | 
			
		||||
    "target": "Machine Intelligence Research Institute — AI Safety Retraining Program",
 | 
			
		||||
 | 
			
		||||
    "distance": 40.39836724233665,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "Seems to support directly people working on the topic, and more counterfactual",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "10 to 100"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Stanford University — Machine Learning Security Research Led by Dan Boneh and Florian Tramer",
 | 
			
		||||
 | 
			
		||||
    "target": "UC Berkeley — AI Safety Research (2018)",
 | 
			
		||||
 | 
			
		||||
    "distance": 7.229755173700019,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "AI Safety Research Affects more people, someone might end up doing something cool",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "5 to 10"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Wilson Center — AI Policy Seminar Series",
 | 
			
		||||
 | 
			
		||||
    "target": "UC Berkeley — AI Safety Research (2018)",
 | 
			
		||||
 | 
			
		||||
    "distance": 2.663515640351876,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "Similar value from the outside",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "0.1 to 10"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "UC Berkeley — AI Safety Research (2018)",
 | 
			
		||||
 | 
			
		||||
    "target": "Open Phil AI Fellowship — 2018 Class",
 | 
			
		||||
 | 
			
		||||
    "distance": 247.53475654135346,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "AI fellows produced directly relevant research, are more successful",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "(1/(0.001 to 0.01))"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Machine Intelligence Research Institute — AI Safety Retraining Program",
 | 
			
		||||
 | 
			
		||||
    "target": "Open Phil AI Fellowship — 2018 Class",
 | 
			
		||||
 | 
			
		||||
    "distance": 49.50695130827075,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "aI fellows seem to have produced more relevant research, though grant is less counterfactual",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "(1/(0.005 to 0.05))"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Ought — General Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "target": "Oxford University — Research on the Global Politics of AI",
 | 
			
		||||
 | 
			
		||||
    "distance": 403.9836724233662,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "GovAI is doing cool stuff, Ought not so much",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "100 to 1000"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "AI Impacts — General Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "target": "Michael Cohen and Dmitrii Krasheninnikov — Scholarship Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "distance": 2.5202870466776885,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "Direct work seems more important, but Ai impacts work is pretty cool",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "1 to 5"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Ought — General Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "target": "AI Impacts — General Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "distance": 109.28343925564944,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "AI impacts work has been more successful \\ useful for my research",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "50 to 200"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "AI Impacts — General Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "target": "Oxford University — Research on the Global Politics of AI",
 | 
			
		||||
 | 
			
		||||
    "distance": 39.678020061969825,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "GovAI is doing more work and on a more neglected topic. Both are doing good work, but GOvAI output is bigger",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "(1/(0.01 to 0.05))"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Oxford University — Research on the Global Politics of AI",
 | 
			
		||||
 | 
			
		||||
    "target": "Michael Cohen and Dmitrii Krasheninnikov — Scholarship Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "distance": 2.865987655844147,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "Cohens work seems harder to replace.\nGovAI is doing more work though",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "0.01 to 10"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Stanford University — Machine Learning Security Research Led by Dan Boneh and Florian Tramer",
 | 
			
		||||
 | 
			
		||||
    "target": "Ought — General Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "distance": 14.338510859889407,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "At least Ought is trying ",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "1 to 50"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Wilson Center — AI Policy Seminar Series",
 | 
			
		||||
 | 
			
		||||
    "target": "Ought — General Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "distance": 2.663515640351876,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "Unclear",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "0.1 to 10"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "UC Berkeley — AI Safety Research (2018)",
 | 
			
		||||
 | 
			
		||||
    "target": "Ought — General Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "distance": 4.039836724233664,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "At least ought is trying",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "1 to 10"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Machine Intelligence Research Institute — AI Safety Retraining Program",
 | 
			
		||||
 | 
			
		||||
    "target": "Ought — General Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "distance": 1.4338510859889406,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "Value more the potential new hire than oughts research",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "0.1 to 5"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Ought — General Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "target": "Open Phil AI Fellowship — 2018 Class",
 | 
			
		||||
 | 
			
		||||
    "distance": 247.53475654135346,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "Fellows seem to have produced more relevant research",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "(1/(0.001 to 0.01))"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "AI Impacts — General Support (2018)",
 | 
			
		||||
 | 
			
		||||
    "target": "Open Phil AI Fellowship — 2018 Class",
 | 
			
		||||
 | 
			
		||||
    "distance": 13.831727022205978,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "Fellows produced more relevant research, AI impacts work is cool though",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "(1/(0.05 to 0.1))"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    "source": "Open Phil AI Fellowship — 2018 Class",
 | 
			
		||||
 | 
			
		||||
    "target": "Oxford University — Research on the Global Politics of AI",
 | 
			
		||||
 | 
			
		||||
    "distance": 32.87330541102063,
 | 
			
		||||
 | 
			
		||||
    "reasoning": "GovAI's grant seems moe counterfactual, their work more directly relevant\n",
 | 
			
		||||
 | 
			
		||||
    "squiggleString": "20 to 50"
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										47
									
								
								packages/utility-tools/input/input-list.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								packages/utility-tools/input/input-list.json
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,47 @@
 | 
			
		|||
[
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Michael Cohen and Dmitrii Krasheninnikov — Scholarship Support (2018)",
 | 
			
		||||
    "url": "https://docs.google.com/document/d/1VlN6I4Jauarx-0Fp7AC1ggeQ02AITsN7S56ffAO9NTU/edit#heading=h.jnlrsr63yliq",
 | 
			
		||||
    "amount": "$159k"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "AI Impacts — General Support (2018)",
 | 
			
		||||
    "url": "https://docs.google.com/document/d/1VlN6I4Jauarx-0Fp7AC1ggeQ02AITsN7S56ffAO9NTU/edit#heading=h.6m6tebpouzt1",
 | 
			
		||||
    "amount": "$100k"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Oxford University — Research on the Global Politics of AI",
 | 
			
		||||
    "url": "https://docs.google.com/document/d/1VlN6I4Jauarx-0Fp7AC1ggeQ02AITsN7S56ffAO9NTU/edit#heading=h.c6r2m7i749ay",
 | 
			
		||||
    "amount": "$429k"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Ought — General Support (2018)",
 | 
			
		||||
    "url": "https://docs.google.com/document/d/1VlN6I4Jauarx-0Fp7AC1ggeQ02AITsN7S56ffAO9NTU/edit#heading=h.xnzaj48k3fdb",
 | 
			
		||||
    "amount": "$525k"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Machine Intelligence Research Institute — AI Safety Retraining Program",
 | 
			
		||||
    "url": "https://docs.google.com/document/d/1VlN6I4Jauarx-0Fp7AC1ggeQ02AITsN7S56ffAO9NTU/edit#heading=h.h922w7eh5rq6",
 | 
			
		||||
    "amount": "$150k"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "UC Berkeley — AI Safety Research (2018)",
 | 
			
		||||
    "url": "https://docs.google.com/document/d/1VlN6I4Jauarx-0Fp7AC1ggeQ02AITsN7S56ffAO9NTU/edit#heading=h.rrsbecbboed8",
 | 
			
		||||
    "amount": "$1.145M"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Open Phil AI Fellowship — 2018 Class",
 | 
			
		||||
    "url": "https://docs.google.com/document/d/1VlN6I4Jauarx-0Fp7AC1ggeQ02AITsN7S56ffAO9NTU/edit#heading=h.p8xd58asz6a2",
 | 
			
		||||
    "amount": "$1.135M"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Wilson Center — AI Policy Seminar Series",
 | 
			
		||||
    "url": "https://docs.google.com/document/d/1VlN6I4Jauarx-0Fp7AC1ggeQ02AITsN7S56ffAO9NTU/edit#heading=h.qiurhycylgi3",
 | 
			
		||||
    "amount": "$400k"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Stanford University — Machine Learning Security Research Led by Dan Boneh and Florian Tramer",
 | 
			
		||||
    "url": "https://docs.google.com/document/d/1VlN6I4Jauarx-0Fp7AC1ggeQ02AITsN7S56ffAO9NTU/edit#heading=h.ox8adhpgba86",
 | 
			
		||||
    "amount": "$100k"
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										95
									
								
								packages/utility-tools/output/output.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								packages/utility-tools/output/output.txt
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,95 @@
 | 
			
		|||
Sorted output:
 | 
			
		||||
  [
 | 
			
		||||
    'Stanford University — Machine Learning Security Research Led by Dan Boneh and Florian Tramer',
 | 
			
		||||
    'Wilson Center — AI Policy Seminar Series',
 | 
			
		||||
    'UC Berkeley — AI Safety Research (2018)',
 | 
			
		||||
    'Machine Intelligence Research Institute — AI Safety Retraining Program',
 | 
			
		||||
    'Ought — General Support (2018)',
 | 
			
		||||
    'AI Impacts — General Support (2018)',
 | 
			
		||||
    'Open Phil AI Fellowship — 2018 Class',
 | 
			
		||||
    'Oxford University — Research on the Global Politics of AI',
 | 
			
		||||
    'Michael Cohen and Dmitrii Krasheninnikov — Scholarship Support (2018)'
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
Stanford University — Machine Learning Security Research Led by Dan Boneh and Florian Tramer
 | 
			
		||||
  Number of paths:  102
 | 
			
		||||
  Mean: 0.04340463625937361
 | 
			
		||||
  90% confidence interval: [
 | 
			
		||||
      3.102187977841675e-7,
 | 
			
		||||
      0.10636313508232977
 | 
			
		||||
  ]
 | 
			
		||||
  3.902 seconds needed for processing
 | 
			
		||||
 | 
			
		||||
Wilson Center — AI Policy Seminar Series
 | 
			
		||||
  Number of paths:  52
 | 
			
		||||
  Mean: 0.23923636834715892
 | 
			
		||||
  90% confidence interval: [
 | 
			
		||||
      0.0000012797707857581555,
 | 
			
		||||
      0.7647175734237982
 | 
			
		||||
  ]
 | 
			
		||||
  0.855 seconds needed for processing
 | 
			
		||||
 | 
			
		||||
UC Berkeley — AI Safety Research (2018)
 | 
			
		||||
  Number of paths:  37
 | 
			
		||||
  Mean: 0.6148765126821536
 | 
			
		||||
  90% confidence interval: [
 | 
			
		||||
      0.0000012857319777641759,
 | 
			
		||||
      2.4285898907477064
 | 
			
		||||
  ]
 | 
			
		||||
  0.484 seconds needed for processing
 | 
			
		||||
 | 
			
		||||
Machine Intelligence Research Institute — AI Safety Retraining Program
 | 
			
		||||
  Number of paths:  21
 | 
			
		||||
  Mean: 46.33576477417035
 | 
			
		||||
  90% confidence interval: [
 | 
			
		||||
      0.000022241280559831212,
 | 
			
		||||
      201.37264605399085
 | 
			
		||||
  ]
 | 
			
		||||
  0.173 seconds needed for processing
 | 
			
		||||
 | 
			
		||||
Ought — General Support (2018)
 | 
			
		||||
  Number of paths:  36
 | 
			
		||||
  Mean: 63.37826067838051
 | 
			
		||||
  90% confidence interval: [
 | 
			
		||||
      0.00004411196776834627,
 | 
			
		||||
      145.5050535108514
 | 
			
		||||
  ]
 | 
			
		||||
  0.412 seconds needed for processing
 | 
			
		||||
 | 
			
		||||
AI Impacts — General Support (2018)
 | 
			
		||||
  Number of paths:  47
 | 
			
		||||
  Mean: 9862.157135402398
 | 
			
		||||
  90% confidence interval: [
 | 
			
		||||
      0.018650934888088284,
 | 
			
		||||
      22307.090052203544
 | 
			
		||||
  ]
 | 
			
		||||
  0.635 seconds needed for processing
 | 
			
		||||
 | 
			
		||||
Open Phil AI Fellowship — 2018 Class
 | 
			
		||||
  Number of paths:  372
 | 
			
		||||
  Mean: 86301.01328794319
 | 
			
		||||
  90% confidence interval: [
 | 
			
		||||
      26.02179139839112,
 | 
			
		||||
      115734.18190287006
 | 
			
		||||
  ]
 | 
			
		||||
  35.203 seconds needed for processing
 | 
			
		||||
 | 
			
		||||
Oxford University — Research on the Global Politics of AI
 | 
			
		||||
  Number of paths:  2261
 | 
			
		||||
  Mean: 785779.6653748289
 | 
			
		||||
  90% confidence interval: [
 | 
			
		||||
      114.32195138741375,
 | 
			
		||||
      960250.7929788446
 | 
			
		||||
  ]
 | 
			
		||||
  1048.955 seconds needed for processing
 | 
			
		||||
 | 
			
		||||
Michael Cohen and Dmitrii Krasheninnikov — Scholarship Support (2018)
 | 
			
		||||
  Number of paths:  5243
 | 
			
		||||
  Mean: 1482642.2273006735
 | 
			
		||||
  90% confidence interval: [
 | 
			
		||||
      8.379381400123396,
 | 
			
		||||
      330071.1150485886
 | 
			
		||||
  ]
 | 
			
		||||
  5550.563 seconds needed for processing
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										15
									
								
								packages/utility-tools/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								packages/utility-tools/package.json
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
{
 | 
			
		||||
  "name": "utility-tools",
 | 
			
		||||
  "version": "0.0.1",
 | 
			
		||||
  "description": "Process the json produced by utility-function-extractor.quantifieduncertainty.org",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "start": "node --max-old-space-size=8192 src/index.js"
 | 
			
		||||
  },
 | 
			
		||||
  "type": "module",
 | 
			
		||||
  "main": "src/index.js",
 | 
			
		||||
  "author": "Nuño Sempere",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@quri/squiggle-lang": "^0.2.11"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										54
									
								
								packages/utility-tools/src/aggregatePaths.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								packages/utility-tools/src/aggregatePaths.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
// EXPORTS
 | 
			
		||||
import { run } from "@quri/squiggle-lang";
 | 
			
		||||
 | 
			
		||||
export function aggregatePaths(pathsArray, nodes) {
 | 
			
		||||
  pathsArray.map((paths, i) => {
 | 
			
		||||
    console.log(nodes[i].name);
 | 
			
		||||
    let multipliedDistributions = paths.map(
 | 
			
		||||
      (path) => path.multipliedDistributionsInPath
 | 
			
		||||
    );
 | 
			
		||||
    console.group();
 | 
			
		||||
    console.log("Number of paths: ", multipliedDistributions.length);
 | 
			
		||||
    // console.log(multipliedDistributions.slice(0, 10));
 | 
			
		||||
    let squiggleCode = `aggregatePath = mx(${multipliedDistributions
 | 
			
		||||
      .filter((distributions) => distributions != undefined)
 | 
			
		||||
      // .slice(0, 600)
 | 
			
		||||
      .join(", ")})`;
 | 
			
		||||
 | 
			
		||||
    // Start measuring time
 | 
			
		||||
    let start = Date.now();
 | 
			
		||||
 | 
			
		||||
    // Get the mean
 | 
			
		||||
    let squiggleCodeForMean = squiggleCode + "\n" + "mean(aggregatePath)";
 | 
			
		||||
    let meanAnswer = run(squiggleCodeForMean);
 | 
			
		||||
    let mean = meanAnswer.value.value;
 | 
			
		||||
    console.log(`Mean: ${mean}`);
 | 
			
		||||
 | 
			
		||||
    // Get the 90% CI
 | 
			
		||||
    let squiggleCodeFor90CI =
 | 
			
		||||
      squiggleCode +
 | 
			
		||||
      "\n" +
 | 
			
		||||
      "[inv(aggregatePath, 0.05), inv(aggregatePath, 0.95)]";
 | 
			
		||||
    let ci90percentAnswer = run(squiggleCodeFor90CI);
 | 
			
		||||
 | 
			
		||||
    // Display output
 | 
			
		||||
    let processCI90 = (answer) => {
 | 
			
		||||
      let value = answer.value.value;
 | 
			
		||||
      let lower = value[0].value;
 | 
			
		||||
      let upper = value[1].value;
 | 
			
		||||
      return [lower, upper];
 | 
			
		||||
    };
 | 
			
		||||
    console.log(
 | 
			
		||||
      `90% confidence interval: ${JSON.stringify(
 | 
			
		||||
        processCI90(ci90percentAnswer),
 | 
			
		||||
        null,
 | 
			
		||||
        4
 | 
			
		||||
      )}`
 | 
			
		||||
    );
 | 
			
		||||
    // Stop measuring time
 | 
			
		||||
    let end = Date.now();
 | 
			
		||||
    console.log(`${(end - start) / 1000} seconds needed for processing`);
 | 
			
		||||
    console.groupEnd();
 | 
			
		||||
    console.log("");
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										314
									
								
								packages/utility-tools/src/findPaths.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										314
									
								
								packages/utility-tools/src/findPaths.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,314 @@
 | 
			
		|||
/* Functions */
 | 
			
		||||
 | 
			
		||||
const pathPlusLink = (pathSoFar, link) => {
 | 
			
		||||
  return [...pathSoFar, link];
 | 
			
		||||
  // previously: pathSoFar.concat(link).flat()
 | 
			
		||||
  // Note that concat is not destructive
 | 
			
		||||
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const findElementPosition = (name, nodes) => {
 | 
			
		||||
  let node = nodes.find((node) => node.name == name);
 | 
			
		||||
  return node.position;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
async function findPathsWithoutPrunning({
 | 
			
		||||
  sourceElementName,
 | 
			
		||||
  targetElementName,
 | 
			
		||||
  maxLengthOfPath,
 | 
			
		||||
  pathSoFar,
 | 
			
		||||
  links,
 | 
			
		||||
  nodes,
 | 
			
		||||
}) {
 | 
			
		||||
  // This is an un-used function which might make findPaths more understandable
 | 
			
		||||
  // It uses the same recursive functionality
 | 
			
		||||
  // but has no path prunning
 | 
			
		||||
  let paths = [];
 | 
			
		||||
 | 
			
		||||
  /* Path traversing */
 | 
			
		||||
  if (maxLengthOfPath > 0) {
 | 
			
		||||
    for (let link of links) {
 | 
			
		||||
      // vs let link of linksNow in findPaths
 | 
			
		||||
      if (
 | 
			
		||||
        (link.source == sourceElementName &&
 | 
			
		||||
          link.target == targetElementName) ||
 | 
			
		||||
        (link.source == targetElementName && link.target == sourceElementName)
 | 
			
		||||
      ) {
 | 
			
		||||
        // direct Path
 | 
			
		||||
        let newPath = pathPlusLink(pathSoFar, link);
 | 
			
		||||
        paths.push(newPath);
 | 
			
		||||
      } else if (link.source == sourceElementName) {
 | 
			
		||||
        let newPaths = await findPaths({
 | 
			
		||||
          pathSoFar: pathPlusLink(pathSoFar, link),
 | 
			
		||||
          maxLengthOfPath: maxLengthOfPath - 1,
 | 
			
		||||
          sourceElementName: link.target,
 | 
			
		||||
          targetElementName,
 | 
			
		||||
          links: links, // vs let link of linksInner in findPaths
 | 
			
		||||
          nodes,
 | 
			
		||||
        });
 | 
			
		||||
        if (newPaths.length != 0) {
 | 
			
		||||
          paths.push(...newPaths);
 | 
			
		||||
        }
 | 
			
		||||
      } else if (link.target == sourceElementName) {
 | 
			
		||||
        let newPaths = await findPaths({
 | 
			
		||||
          pathSoFar: pathPlusLink(pathSoFar, link),
 | 
			
		||||
          maxLengthOfPath: maxLengthOfPath - 1,
 | 
			
		||||
          sourceElementName: link.source,
 | 
			
		||||
          targetElementName,
 | 
			
		||||
          links: links, // vs let link of linksInner in findPaths
 | 
			
		||||
          nodes,
 | 
			
		||||
        });
 | 
			
		||||
        if (newPaths.length != 0) {
 | 
			
		||||
          paths.push(...newPaths);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return paths;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function findPaths({
 | 
			
		||||
  sourceElementName,
 | 
			
		||||
  sourceElementPosition,
 | 
			
		||||
  targetElementName,
 | 
			
		||||
  targetElementPosition,
 | 
			
		||||
  maxLengthOfPath,
 | 
			
		||||
  pathSoFar,
 | 
			
		||||
  links,
 | 
			
		||||
  nodes,
 | 
			
		||||
}) {
 | 
			
		||||
  // This is the key path finding function
 | 
			
		||||
  // It finds the path from one element to another, recursively
 | 
			
		||||
  // It used to be very computationally expensive until I added
 | 
			
		||||
  // the path prunning step: Instead of traversing all links,
 | 
			
		||||
  // traverse only those which are between the origin and target links
 | 
			
		||||
  // this requires us to have a notion of "between"
 | 
			
		||||
 | 
			
		||||
  let paths = [];
 | 
			
		||||
 | 
			
		||||
  /* Path prunning*/
 | 
			
		||||
  let minPos = Math.min(sourceElementPosition, targetElementPosition);
 | 
			
		||||
  let maxPos = Math.max(sourceElementPosition, targetElementPosition);
 | 
			
		||||
  let linksInner = links.filter(
 | 
			
		||||
    (link) =>
 | 
			
		||||
      minPos <= link.sourceElementPosition &&
 | 
			
		||||
      link.sourceElementPosition <= maxPos &&
 | 
			
		||||
      minPos <= link.targetElementPosition &&
 | 
			
		||||
      link.targetElementPosition <= maxPos
 | 
			
		||||
  );
 | 
			
		||||
  let linksNow = linksInner.filter(
 | 
			
		||||
    (link) =>
 | 
			
		||||
      link.source == sourceElementName || link.target == sourceElementName
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  /* Path traversing */
 | 
			
		||||
  if (maxLengthOfPath > 0) {
 | 
			
		||||
    for (let link of linksNow) {
 | 
			
		||||
      if (
 | 
			
		||||
        (link.source == sourceElementName &&
 | 
			
		||||
          link.target == targetElementName) ||
 | 
			
		||||
        (link.source == targetElementName && link.target == sourceElementName)
 | 
			
		||||
      ) {
 | 
			
		||||
        // direct Path
 | 
			
		||||
        let newPath = pathPlusLink(pathSoFar, link);
 | 
			
		||||
        paths.push(newPath);
 | 
			
		||||
      } else if (link.source == sourceElementName) {
 | 
			
		||||
        let newPaths = await findPaths({
 | 
			
		||||
          pathSoFar: pathPlusLink(pathSoFar, link),
 | 
			
		||||
          maxLengthOfPath: maxLengthOfPath - 1,
 | 
			
		||||
          sourceElementPosition: link.sourceElementPosition,
 | 
			
		||||
          sourceElementName: link.target,
 | 
			
		||||
          targetElementName,
 | 
			
		||||
          targetElementPosition,
 | 
			
		||||
          links: linksInner,
 | 
			
		||||
          nodes,
 | 
			
		||||
        });
 | 
			
		||||
        if (newPaths.length != 0) {
 | 
			
		||||
          paths.push(...newPaths);
 | 
			
		||||
        }
 | 
			
		||||
      } else if (link.target == sourceElementName) {
 | 
			
		||||
        let newPaths = await findPaths({
 | 
			
		||||
          pathSoFar: pathPlusLink(pathSoFar, link),
 | 
			
		||||
          maxLengthOfPath: maxLengthOfPath - 1,
 | 
			
		||||
          sourceElementPosition: link.sourceElementPosition,
 | 
			
		||||
          sourceElementName: link.source,
 | 
			
		||||
          targetElementPosition,
 | 
			
		||||
          targetElementName,
 | 
			
		||||
          links: linksInner,
 | 
			
		||||
          nodes,
 | 
			
		||||
        });
 | 
			
		||||
        if (newPaths.length != 0) {
 | 
			
		||||
          paths.push(...newPaths);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return paths;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function findExpectedValuesAndDistributionsForElement({
 | 
			
		||||
  sourceElementName,
 | 
			
		||||
  sourceElementPosition,
 | 
			
		||||
  targetElementName,
 | 
			
		||||
  targetElementPosition,
 | 
			
		||||
  nodes,
 | 
			
		||||
  links,
 | 
			
		||||
}) {
 | 
			
		||||
  // This function gets all possible paths using findPaths
 | 
			
		||||
  // then orders them correctly in the for loop
 | 
			
		||||
  // (by flipping the distance to 1/distance when necessary)
 | 
			
		||||
  // and then gets the array of weights for the different paths.
 | 
			
		||||
  /*
 | 
			
		||||
	console.log(
 | 
			
		||||
    `findDistance@findPaths.js from ${sourceElementPosition} to ${targetElementPosition}`
 | 
			
		||||
  );
 | 
			
		||||
  */
 | 
			
		||||
  let maxLengthOfPath = Math.abs(sourceElementPosition - targetElementPosition);
 | 
			
		||||
  let paths = await findPaths({
 | 
			
		||||
    sourceElementName,
 | 
			
		||||
    sourceElementPosition,
 | 
			
		||||
    targetElementName,
 | 
			
		||||
    targetElementPosition,
 | 
			
		||||
    links,
 | 
			
		||||
    nodes,
 | 
			
		||||
    maxLengthOfPath,
 | 
			
		||||
    pathSoFar: [],
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  let processedPaths = [];
 | 
			
		||||
  for (let path of paths) {
 | 
			
		||||
    let currentSource = sourceElementName;
 | 
			
		||||
    let expectedRelativeValue = 1;
 | 
			
		||||
    let multipliedDistributionsInPath = 1;
 | 
			
		||||
    let distances = [];
 | 
			
		||||
    for (let element of path) {
 | 
			
		||||
      let distance = 0;
 | 
			
		||||
      let anotherDistributionInPath = 1;
 | 
			
		||||
      if (element.source == currentSource) {
 | 
			
		||||
        distance = element.distance;
 | 
			
		||||
        anotherDistributionInPath = element.squiggleString;
 | 
			
		||||
        currentSource = element.target;
 | 
			
		||||
      } else if (element.target == currentSource) {
 | 
			
		||||
        distance = 1 / Number(element.distance);
 | 
			
		||||
        anotherDistributionInPath = `1 / (${element.squiggleString})`;
 | 
			
		||||
        currentSource = element.source;
 | 
			
		||||
      }
 | 
			
		||||
      expectedRelativeValue = expectedRelativeValue * distance;
 | 
			
		||||
      distances.push(distance);
 | 
			
		||||
      multipliedDistributionsInPath = `${multipliedDistributionsInPath} * (${anotherDistributionInPath})`;
 | 
			
		||||
    }
 | 
			
		||||
    processedPaths.push({
 | 
			
		||||
      distances,
 | 
			
		||||
      expectedRelativeValue,
 | 
			
		||||
      multipliedDistributionsInPath,
 | 
			
		||||
      // path,
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
  return processedPaths;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
  let expectedValues = [];
 | 
			
		||||
  for (let path of paths) {
 | 
			
		||||
    let currentSource = sourceElementName;
 | 
			
		||||
    let weight = 1;
 | 
			
		||||
    for (let element of path) {
 | 
			
		||||
      let distance = 0;
 | 
			
		||||
      if (element.source == currentSource) {
 | 
			
		||||
        distance = element.distance;
 | 
			
		||||
        currentSource = element.target;
 | 
			
		||||
      } else if (element.target == currentSource) {
 | 
			
		||||
        distance = 1 / Number(element.distance);
 | 
			
		||||
        currentSource = element.source;
 | 
			
		||||
      }
 | 
			
		||||
      weight = weight * distance;
 | 
			
		||||
    }
 | 
			
		||||
    expectedValues.push(weight);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  let distributionalForm = [];
 | 
			
		||||
  for (let path of paths) {
 | 
			
		||||
    let currentSource = sourceElementName;
 | 
			
		||||
    let multipliedDistributionsInPath = 1;
 | 
			
		||||
    for (let element of path) {
 | 
			
		||||
      let anotherDistributionInPath;
 | 
			
		||||
      if (element.source == currentSource) {
 | 
			
		||||
        distributionInPath = element.squiggleString;
 | 
			
		||||
        currentSource = element.target;
 | 
			
		||||
      } else if (element.target == currentSource) {
 | 
			
		||||
        distance = `1 / (${element.squiggleString})`;
 | 
			
		||||
        currentSource = element.source;
 | 
			
		||||
      }
 | 
			
		||||
      multipliedDistributionsInPath = `${multipliedDistributionsInPath} * (${anotherDistributionInPath})`;
 | 
			
		||||
    }
 | 
			
		||||
    distributionalForm.push(multipliedDistributionsInPath);
 | 
			
		||||
  }
 | 
			
		||||
    return {
 | 
			
		||||
    expectedValues,
 | 
			
		||||
    distributionalForm,
 | 
			
		||||
    // paths,
 | 
			
		||||
  };
 | 
			
		||||
  */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function findDistancesFromAllElementsToReferencePoint({
 | 
			
		||||
  nodes,
 | 
			
		||||
  links,
 | 
			
		||||
  referenceElement,
 | 
			
		||||
}) {
 | 
			
		||||
  // Simple wrapper function around findDistance
 | 
			
		||||
  // Needs to find the reference point first
 | 
			
		||||
  // console.log("findDistancesForAllElements@findPaths.js");
 | 
			
		||||
  /* Get or build reference element */
 | 
			
		||||
  let midpoint = Math.round(nodes.length / 2);
 | 
			
		||||
  referenceElement = referenceElement || nodes[midpoint];
 | 
			
		||||
  // console.log(`referenceElement.position: ${referenceElement.position}`);
 | 
			
		||||
 | 
			
		||||
  /* Get distances. */
 | 
			
		||||
  let distancesArray = nodes.map((node) => {
 | 
			
		||||
    if (node.name == referenceElement.name) {
 | 
			
		||||
      return [1];
 | 
			
		||||
    } else {
 | 
			
		||||
      // console.log("node");
 | 
			
		||||
      // console.log(node);
 | 
			
		||||
      let expectedValuesAndDistributionsForElement =
 | 
			
		||||
        findExpectedValuesAndDistributionsForElement({
 | 
			
		||||
          sourceElementName: referenceElement.name,
 | 
			
		||||
          sourceElementPosition: referenceElement.position,
 | 
			
		||||
          targetElementName: node.name,
 | 
			
		||||
          targetElementPosition: node.position,
 | 
			
		||||
          nodes: nodes,
 | 
			
		||||
          links: links,
 | 
			
		||||
        });
 | 
			
		||||
      return expectedValuesAndDistributionsForElement;
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
  distancesArray = await Promise.all(distancesArray);
 | 
			
		||||
  return distancesArray;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function findDistancesFromAllElementsToAllReferencePoints({
 | 
			
		||||
  nodes,
 | 
			
		||||
  links,
 | 
			
		||||
}) {
 | 
			
		||||
  let nodes2 = nodes.map((node) => ({ ...node, isReferenceValue: false }));
 | 
			
		||||
  let distancesForAllElements = Array(nodes.length);
 | 
			
		||||
  for (let i = 0; i < nodes.length; i++) {
 | 
			
		||||
    distancesForAllElements[i] = [];
 | 
			
		||||
  }
 | 
			
		||||
  for (let node of nodes2) {
 | 
			
		||||
    let distancesFromNode = await findDistancesFromAllElementsToReferencePoint({
 | 
			
		||||
      nodes: nodes2,
 | 
			
		||||
      links,
 | 
			
		||||
      referenceElement: node,
 | 
			
		||||
    });
 | 
			
		||||
    // alert(`distancesFromNode.length: ${distancesFromNode.length}`);
 | 
			
		||||
    distancesForAllElements = distancesForAllElements.map((arr, i) => {
 | 
			
		||||
      return !!arr && arr.length > 0
 | 
			
		||||
        ? [...arr, ...distancesFromNode[i]]
 | 
			
		||||
        : distancesFromNode[i];
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
  return distancesForAllElements;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										60
									
								
								packages/utility-tools/src/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								packages/utility-tools/src/index.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
// IMPORTS
 | 
			
		||||
import * as fs from "fs";
 | 
			
		||||
import { mergeSort } from "./mergeSort.js";
 | 
			
		||||
import { findDistancesFromAllElementsToAllReferencePoints } from "./findPaths.js";
 | 
			
		||||
import { aggregatePaths } from "./aggregatePaths.js";
 | 
			
		||||
 | 
			
		||||
// DEFS
 | 
			
		||||
const inputLinksFilePath = "./input/input-links.json";
 | 
			
		||||
const inputListFilePath = "./input/input-list.json";
 | 
			
		||||
const outputFilePath = "./output/output.json";
 | 
			
		||||
 | 
			
		||||
// HELPERS
 | 
			
		||||
 | 
			
		||||
const findElementPosition = (name, orderedList) => {
 | 
			
		||||
  let node = orderedList.find((node) => node.name == name);
 | 
			
		||||
  return node.position;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// MAIN
 | 
			
		||||
async function main() {
 | 
			
		||||
  // read file
 | 
			
		||||
  const inputLinksAsString = fs.readFileSync(inputLinksFilePath);
 | 
			
		||||
  const inputListAsString = fs.readFileSync(inputListFilePath);
 | 
			
		||||
  const links = JSON.parse(inputLinksAsString);
 | 
			
		||||
  const list = JSON.parse(inputListAsString);
 | 
			
		||||
 | 
			
		||||
  // process file
 | 
			
		||||
  // const sources = links.map((link) => link.source);
 | 
			
		||||
  // const targets = links.map((link) => link.target);
 | 
			
		||||
  // const list = [...new Set([...sources, ...targets])];
 | 
			
		||||
 | 
			
		||||
  // Merge sort
 | 
			
		||||
  let mergeSortOutput = mergeSort({ list, links });
 | 
			
		||||
  // console.log("Output: ");
 | 
			
		||||
  console.log("Sorted output: ");
 | 
			
		||||
  console.group();
 | 
			
		||||
  console.log(mergeSortOutput.map((x) => x.name));
 | 
			
		||||
  console.groupEnd();
 | 
			
		||||
  console.log("");
 | 
			
		||||
 | 
			
		||||
  // find Paths
 | 
			
		||||
  let nodes = mergeSortOutput.map((element, i) => ({
 | 
			
		||||
    ...element,
 | 
			
		||||
    position: i,
 | 
			
		||||
  }));
 | 
			
		||||
  const linksWithPosition = links.map((link) => ({
 | 
			
		||||
    ...link,
 | 
			
		||||
    sourceElementPosition: findElementPosition(link.source, nodes),
 | 
			
		||||
    targetElementPosition: findElementPosition(link.target, nodes),
 | 
			
		||||
  }));
 | 
			
		||||
  let paths = await findDistancesFromAllElementsToAllReferencePoints({
 | 
			
		||||
    nodes,
 | 
			
		||||
    links: linksWithPosition,
 | 
			
		||||
  });
 | 
			
		||||
  // console.log(JSON.stringify(paths, null, 4));
 | 
			
		||||
 | 
			
		||||
  // Aggregate paths.
 | 
			
		||||
  let aggregatedPaths = aggregatePaths(paths, nodes);
 | 
			
		||||
}
 | 
			
		||||
main();
 | 
			
		||||
							
								
								
									
										115
									
								
								packages/utility-tools/src/mergeSort.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								packages/utility-tools/src/mergeSort.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,115 @@
 | 
			
		|||
const errorMsg = "No link found; unable to proceed";
 | 
			
		||||
 | 
			
		||||
function isFirstElementGreater(links, element1, element2) {
 | 
			
		||||
  const relevantComparisons = links.filter(
 | 
			
		||||
    (link) =>
 | 
			
		||||
      (link.source == element1.name && link.target == element2.name) ||
 | 
			
		||||
      (link.source == element2.name && link.target == element1.name)
 | 
			
		||||
  );
 | 
			
		||||
  if (relevantComparisons.length == 0) {
 | 
			
		||||
    // console.log(element1, "vs", element2);
 | 
			
		||||
    return errorMsg;
 | 
			
		||||
  } else {
 | 
			
		||||
    const firstLink = relevantComparisons[0];
 | 
			
		||||
    // console.log(firstLink);
 | 
			
		||||
    const firstElementFirst =
 | 
			
		||||
      firstLink.source == element1.name && firstLink.target == element2.name
 | 
			
		||||
        ? true
 | 
			
		||||
        : false;
 | 
			
		||||
    const distanceIsGreaterThanOne = Number(firstLink.distance) > 1;
 | 
			
		||||
    const answer =
 | 
			
		||||
      (firstElementFirst && !distanceIsGreaterThanOne) ||
 | 
			
		||||
      (!firstElementFirst && distanceIsGreaterThanOne);
 | 
			
		||||
    return !answer;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function merge(links, left, right) {
 | 
			
		||||
  let sortedArr = []; // the sorted elements will go here
 | 
			
		||||
 | 
			
		||||
  while (left.length && right.length) {
 | 
			
		||||
    // insert the biggest element to the sortedArr
 | 
			
		||||
    let link = isFirstElementGreater(links, left[0], right[0]);
 | 
			
		||||
    if (link == errorMsg) {
 | 
			
		||||
      // console.log("Error@:");
 | 
			
		||||
      // console.group();
 | 
			
		||||
      // console.log({ left, right });
 | 
			
		||||
      // console.groupEnd();
 | 
			
		||||
      return errorMsg;
 | 
			
		||||
    } else if (link) {
 | 
			
		||||
      // left[0] > right[0]
 | 
			
		||||
      sortedArr.push(left.shift());
 | 
			
		||||
    } else {
 | 
			
		||||
      sortedArr.push(right.shift());
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // use spread operator and create a new array, combining the three arrays
 | 
			
		||||
  return [...sortedArr, ...left, ...right]; // if they don't have the same size, the remaining ones will be greater than the ones before
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function mergeSortInner({ list, links }) {
 | 
			
		||||
  // console.log({ l: list.length });
 | 
			
		||||
  if (list == errorMsg) {
 | 
			
		||||
    return errorMsg;
 | 
			
		||||
  }
 | 
			
		||||
  const half = list.length / 2;
 | 
			
		||||
 | 
			
		||||
  // the base case is list length <=1
 | 
			
		||||
  if (list.length <= 1) {
 | 
			
		||||
    return list;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const left = list.slice(0, half); // the first half of the list
 | 
			
		||||
  const right = list.slice(half, list.length); // Note that splice is destructive.
 | 
			
		||||
  let orderedFirstHalf = mergeSortInner({ list: left, links });
 | 
			
		||||
  let orderedSecondHalf = mergeSortInner({ list: right, links });
 | 
			
		||||
  if (orderedFirstHalf != errorMsg && orderedSecondHalf != errorMsg) {
 | 
			
		||||
    let result = merge(links, orderedFirstHalf, orderedSecondHalf);
 | 
			
		||||
    return result;
 | 
			
		||||
  } else {
 | 
			
		||||
    return errorMsg;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function mergeSort({ list, links }) {
 | 
			
		||||
  // Try normally
 | 
			
		||||
  let answer = mergeSortInner({ list, links });
 | 
			
		||||
  if (answer != errorMsg) return answer;
 | 
			
		||||
 | 
			
		||||
  // otherwise
 | 
			
		||||
  let permutation = list.slice();
 | 
			
		||||
  var length = list.length;
 | 
			
		||||
  // let result = [list.slice()];
 | 
			
		||||
  let c = new Array(length).fill(0);
 | 
			
		||||
  let i = 1;
 | 
			
		||||
  let k;
 | 
			
		||||
  let p;
 | 
			
		||||
  let counter = 0;
 | 
			
		||||
 | 
			
		||||
  while (i < length) {
 | 
			
		||||
    counter++;
 | 
			
		||||
    if (counter > 10) console.log(counter);
 | 
			
		||||
    if (c[i] < i) {
 | 
			
		||||
      k = i % 2 && c[i];
 | 
			
		||||
      p = permutation[i];
 | 
			
		||||
      permutation[i] = permutation[k];
 | 
			
		||||
      permutation[k] = p;
 | 
			
		||||
      // ++c[i];
 | 
			
		||||
      c[i] = c[i] + 1;
 | 
			
		||||
      i = 1;
 | 
			
		||||
      let answer = mergeSortInner({ list: permutation, links });
 | 
			
		||||
      if (answer != errorMsg) {
 | 
			
		||||
        console.log(answer);
 | 
			
		||||
        return answer;
 | 
			
		||||
      }
 | 
			
		||||
      // result.push(permutation.slice());
 | 
			
		||||
    } else {
 | 
			
		||||
      c[i] = 0;
 | 
			
		||||
      i = i + 1;
 | 
			
		||||
      // ++i;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  console.log("Error");
 | 
			
		||||
  return "Error: The original list was wrongly ordered, and trying permutations didn't work";
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										498
									
								
								packages/utility-tools/yarn.lock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										498
									
								
								packages/utility-tools/yarn.lock
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,498 @@
 | 
			
		|||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
 | 
			
		||||
# yarn lockfile v1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
"@babel/runtime@^7.18.3":
 | 
			
		||||
  version "7.18.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4"
 | 
			
		||||
  integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    regenerator-runtime "^0.13.4"
 | 
			
		||||
 | 
			
		||||
"@quri/squiggle-lang@^0.2.11":
 | 
			
		||||
  version "0.2.11"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@quri/squiggle-lang/-/squiggle-lang-0.2.11.tgz#fc9df37c1c5537b4da099c71c8249373210cfadf"
 | 
			
		||||
  integrity sha512-n879EbSS0eWWEl+s38XmB4xDy18wOJSk3t7moCxIGDhUc70aH1kgNhg56M+M57a8f55MbIhhr7kAVb9RbqqhuA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/stats" "^0.0.13"
 | 
			
		||||
    jstat "^1.9.5"
 | 
			
		||||
    lodash "^4.17.21"
 | 
			
		||||
    mathjs "^10.6.0"
 | 
			
		||||
    pdfast "^0.2.0"
 | 
			
		||||
    rescript "^9.1.4"
 | 
			
		||||
 | 
			
		||||
"@stdlib/array@^0.0.x":
 | 
			
		||||
  version "0.0.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/array/-/array-0.0.12.tgz#12f40ab95bb36d424cdad991f29fc3cb491ee29e"
 | 
			
		||||
  integrity sha512-nDksiuvRC1dSTHrf5yOGQmlRwAzSKV8MdFQwFSvLbZGGhi5Y4hExqea5HloLgNVouVs8lnAFi2oubSM4Mc7YAg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/blas" "^0.0.x"
 | 
			
		||||
    "@stdlib/complex" "^0.0.x"
 | 
			
		||||
    "@stdlib/constants" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/symbol" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/assert@^0.0.x":
 | 
			
		||||
  version "0.0.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/assert/-/assert-0.0.12.tgz#1648c9016e5041291f55a6464abcc4069c5103ce"
 | 
			
		||||
  integrity sha512-38FxFf+ZoQZbdc+m09UsWtaCmzd/2e7im0JOaaFYE7icmRfm+4KiE9BRvBT4tIn7ioLB2f9PsBicKjIsf+tY1w==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/array" "^0.0.x"
 | 
			
		||||
    "@stdlib/cli" "^0.0.x"
 | 
			
		||||
    "@stdlib/complex" "^0.0.x"
 | 
			
		||||
    "@stdlib/constants" "^0.0.x"
 | 
			
		||||
    "@stdlib/fs" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/ndarray" "^0.0.x"
 | 
			
		||||
    "@stdlib/number" "^0.0.x"
 | 
			
		||||
    "@stdlib/os" "^0.0.x"
 | 
			
		||||
    "@stdlib/process" "^0.0.x"
 | 
			
		||||
    "@stdlib/regexp" "^0.0.x"
 | 
			
		||||
    "@stdlib/streams" "^0.0.x"
 | 
			
		||||
    "@stdlib/string" "^0.0.x"
 | 
			
		||||
    "@stdlib/symbol" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/bigint@^0.0.x":
 | 
			
		||||
  version "0.0.11"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/bigint/-/bigint-0.0.11.tgz#c416a1d727001c55f4897e6424124199d638f2fd"
 | 
			
		||||
  integrity sha512-uz0aYDLABAYyqxaCSHYbUt0yPkXYUCR7TrVvHN+UUD3i8FZ02ZKcLO+faKisDyxKEoSFTNtn3Ro8Ir5ebOlVXQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/blas@^0.0.x":
 | 
			
		||||
  version "0.0.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/blas/-/blas-0.0.12.tgz#7e93e42b4621fc6903bf63264f045047333536c2"
 | 
			
		||||
  integrity sha512-nWY749bWceuoWQ7gz977blCwR7lyQ/rsIXVO4b600h+NFpeA2i/ea7MYC680utIbeu2cnDWHdglBPoK535VAzA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/array" "^0.0.x"
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/number" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/buffer@^0.0.x":
 | 
			
		||||
  version "0.0.11"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/buffer/-/buffer-0.0.11.tgz#6137b00845e6c905181cc7ebfae9f7e47c01b0ce"
 | 
			
		||||
  integrity sha512-Jeie5eDDa1tVuRcuU+cBXI/oOXSmMxUUccZpqXzgYe0IO8QSNtNxv9mUTzJk/m5wH+lmLoDvNxzPpOH9TODjJg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/array" "^0.0.x"
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/process" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/cli@^0.0.x":
 | 
			
		||||
  version "0.0.10"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/cli/-/cli-0.0.10.tgz#28e2fbe6865d7f5cd15b7dc5846c99bd3b91674f"
 | 
			
		||||
  integrity sha512-OITGaxG46kwK799+NuOd/+ccosJ9koVuQBC610DDJv0ZJf8mD7sbjGXrmue9C4EOh8MP7Vm/6HN14BojX8oTCg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
    minimist "^1.2.0"
 | 
			
		||||
 | 
			
		||||
"@stdlib/complex@^0.0.x":
 | 
			
		||||
  version "0.0.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/complex/-/complex-0.0.12.tgz#3afbc190cd0a9b37fc7c6e508c3aa9fda9106944"
 | 
			
		||||
  integrity sha512-UbZBdaUxT2G+lsTIrVlRZwx2IRY6GXnVILggeejsIVxHSuK+oTyapfetcAv0FJFLP+Rrr+ZzrN4b9G3hBw6NHA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/array" "^0.0.x"
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/constants@^0.0.x":
 | 
			
		||||
  version "0.0.11"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/constants/-/constants-0.0.11.tgz#78cd56d6c2982b30264843c3d75bde7125e90cd2"
 | 
			
		||||
  integrity sha512-cWKy0L9hXHUQTvFzdPkTvZnn/5Pjv7H4UwY0WC1rLt+A5CxFDJKjvnIi9ypSzJS3CAiGl1ZaHCdadoqXhNdkUg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/array" "^0.0.x"
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/number" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/fs@^0.0.x":
 | 
			
		||||
  version "0.0.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/fs/-/fs-0.0.12.tgz#662365fd5846a51f075724b4f2888ae88441b70d"
 | 
			
		||||
  integrity sha512-zcDLbt39EEM3M3wJW6luChS53B8T+TMJkjs2526UpKJ71O0/0adR57cI7PfCpkMd33d05uM7GM+leEj4eks4Cw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/array" "^0.0.x"
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/cli" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/process" "^0.0.x"
 | 
			
		||||
    "@stdlib/string" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
    debug "^2.6.9"
 | 
			
		||||
 | 
			
		||||
"@stdlib/math@^0.0.x":
 | 
			
		||||
  version "0.0.11"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/math/-/math-0.0.11.tgz#eb6638bc03a20fbd6727dd5b977ee0170bda4649"
 | 
			
		||||
  integrity sha512-qI78sR1QqGjHj8k/aAqkZ51Su2fyBvaR/jMKQqcB/ML8bpYpf+QGlGvTty5Qdru/wpqds4kVFOVbWGcNFIV2+Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/constants" "^0.0.x"
 | 
			
		||||
    "@stdlib/ndarray" "^0.0.x"
 | 
			
		||||
    "@stdlib/number" "^0.0.x"
 | 
			
		||||
    "@stdlib/strided" "^0.0.x"
 | 
			
		||||
    "@stdlib/symbol" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
    debug "^2.6.9"
 | 
			
		||||
 | 
			
		||||
"@stdlib/ndarray@^0.0.x":
 | 
			
		||||
  version "0.0.13"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/ndarray/-/ndarray-0.0.13.tgz#2e8fc645e10f56a645a0ab81598808c0e8f43b82"
 | 
			
		||||
  integrity sha512-Z+U9KJP4U2HWrLtuAXSPvhNetAdqaNLMcliR6S/fz+VPlFDeymRK7omRFMgVQ+1zcAvIgKZGJxpLC3vjiPUYEw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/array" "^0.0.x"
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/bigint" "^0.0.x"
 | 
			
		||||
    "@stdlib/buffer" "^0.0.x"
 | 
			
		||||
    "@stdlib/complex" "^0.0.x"
 | 
			
		||||
    "@stdlib/constants" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/number" "^0.0.x"
 | 
			
		||||
    "@stdlib/string" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/nlp@^0.0.x":
 | 
			
		||||
  version "0.0.11"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/nlp/-/nlp-0.0.11.tgz#532ec0f7267b8d639e4c20c6de864e8de8a09054"
 | 
			
		||||
  integrity sha512-D9avYWANm0Db2W7RpzdSdi5GxRYALGAqUrNnRnnKIO6sMEfr/DvONoAbWruda4QyvSC+0MJNwcEn7+PHhRwYhw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/array" "^0.0.x"
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/random" "^0.0.x"
 | 
			
		||||
    "@stdlib/string" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/number@^0.0.x":
 | 
			
		||||
  version "0.0.10"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/number/-/number-0.0.10.tgz#4030ad8fc3fac19a9afb415c443cee6deea0e65c"
 | 
			
		||||
  integrity sha512-RyfoP9MlnX4kccvg8qv7vYQPbLdzfS1Mnp/prGOoWhvMG3pyBwFAan34kwFb5IS/zHC3W5EmrgXCV2QWyLg/Kg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/array" "^0.0.x"
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/constants" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/os" "^0.0.x"
 | 
			
		||||
    "@stdlib/string" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/os@^0.0.x":
 | 
			
		||||
  version "0.0.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/os/-/os-0.0.12.tgz#08bbf013c62a7153099fa9cbac086ca1349a4677"
 | 
			
		||||
  integrity sha512-O7lklZ/9XEzoCmYvzjPh7jrFWkbpOSHGI71ve3dkSvBy5tyiSL3TtivfKsIC+9ZxuEJZ3d3lIjc9e+yz4HVbqQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/cli" "^0.0.x"
 | 
			
		||||
    "@stdlib/fs" "^0.0.x"
 | 
			
		||||
    "@stdlib/process" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/process@^0.0.x":
 | 
			
		||||
  version "0.0.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/process/-/process-0.0.12.tgz#123325079d89a32f4212f72fb694f8fe3614cf18"
 | 
			
		||||
  integrity sha512-P0X0TMvkissBE1Wr877Avi2/AxmP7X5Toa6GatHbpJdDg6jQmN4SgPd+NZNp98YtZUyk478c8XSIzMr1krQ20g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/buffer" "^0.0.x"
 | 
			
		||||
    "@stdlib/cli" "^0.0.x"
 | 
			
		||||
    "@stdlib/fs" "^0.0.x"
 | 
			
		||||
    "@stdlib/streams" "^0.0.x"
 | 
			
		||||
    "@stdlib/string" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/random@^0.0.x":
 | 
			
		||||
  version "0.0.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/random/-/random-0.0.12.tgz#e819c3abd602ed5559ba800dba751e49c633ff85"
 | 
			
		||||
  integrity sha512-c5yND4Ahnm9Jx0I+jsKhn4Yrz10D53ALSrIe3PG1qIz3kNFcIPnmvCuNGd+3V4ch4Mbrez55Y8z/ZC5RJh4vJQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/array" "^0.0.x"
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/blas" "^0.0.x"
 | 
			
		||||
    "@stdlib/buffer" "^0.0.x"
 | 
			
		||||
    "@stdlib/cli" "^0.0.x"
 | 
			
		||||
    "@stdlib/constants" "^0.0.x"
 | 
			
		||||
    "@stdlib/fs" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/process" "^0.0.x"
 | 
			
		||||
    "@stdlib/stats" "^0.0.x"
 | 
			
		||||
    "@stdlib/streams" "^0.0.x"
 | 
			
		||||
    "@stdlib/symbol" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
    debug "^2.6.9"
 | 
			
		||||
    readable-stream "^2.1.4"
 | 
			
		||||
 | 
			
		||||
"@stdlib/regexp@^0.0.x":
 | 
			
		||||
  version "0.0.13"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/regexp/-/regexp-0.0.13.tgz#80b98361dc7a441b47bc3fa964bb0c826759e971"
 | 
			
		||||
  integrity sha512-3JT5ZIoq/1nXY+dY+QtkU8/m7oWDeekyItEEXMx9c/AOf0ph8fmvTUGMDNfUq0RetcznFe3b66kFz6Zt4XHviA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/stats@^0.0.13", "@stdlib/stats@^0.0.x":
 | 
			
		||||
  version "0.0.13"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/stats/-/stats-0.0.13.tgz#87c973f385379d794707c7b5196a173dba8b07e1"
 | 
			
		||||
  integrity sha512-hm+t32dKbx/L7+7WlQ1o4NDEzV0J4QSnwFBCsIMIAO8+VPxTZ4FxyNERl4oKlS3hZZe4AVKjoOVhBDtgEWrS4g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/array" "^0.0.x"
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/blas" "^0.0.x"
 | 
			
		||||
    "@stdlib/constants" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/ndarray" "^0.0.x"
 | 
			
		||||
    "@stdlib/random" "^0.0.x"
 | 
			
		||||
    "@stdlib/string" "^0.0.x"
 | 
			
		||||
    "@stdlib/symbol" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/streams@^0.0.x":
 | 
			
		||||
  version "0.0.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/streams/-/streams-0.0.12.tgz#07f5ceae5852590afad8e1cb7ce94174becc8739"
 | 
			
		||||
  integrity sha512-YLUlXwjJNknHp92IkJUdvn5jEQjDckpawKhDLLCoxyh3h5V+w/8+61SH7TMTfKx5lBxKJ8vvtchZh90mIJOAjQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/buffer" "^0.0.x"
 | 
			
		||||
    "@stdlib/cli" "^0.0.x"
 | 
			
		||||
    "@stdlib/fs" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
    debug "^2.6.9"
 | 
			
		||||
    readable-stream "^2.1.4"
 | 
			
		||||
 | 
			
		||||
"@stdlib/strided@^0.0.x":
 | 
			
		||||
  version "0.0.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/strided/-/strided-0.0.12.tgz#86ac48e660cb7f64a45cf07e80cbbfe58be21ae1"
 | 
			
		||||
  integrity sha512-1NINP+Y7IJht34iri/bYLY7TVxrip51f6Z3qWxGHUCH33kvk5H5QqV+RsmFEGbbyoGtdeHrT2O+xA+7R2e3SNg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/ndarray" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/string@^0.0.x":
 | 
			
		||||
  version "0.0.13"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/string/-/string-0.0.13.tgz#37457ca49e8d1dff0e523c68f5673c655c79eb2d"
 | 
			
		||||
  integrity sha512-nGMHi7Qk9LBW0+Y+e3pSePQEBqyWH7+7DjFR1APcbsYccJE0p4aCaQdhPhx9Tp7j3uRGBmqPFek8wpcvIuC+CQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/cli" "^0.0.x"
 | 
			
		||||
    "@stdlib/constants" "^0.0.x"
 | 
			
		||||
    "@stdlib/fs" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/nlp" "^0.0.x"
 | 
			
		||||
    "@stdlib/process" "^0.0.x"
 | 
			
		||||
    "@stdlib/regexp" "^0.0.x"
 | 
			
		||||
    "@stdlib/streams" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/symbol@^0.0.x":
 | 
			
		||||
  version "0.0.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/symbol/-/symbol-0.0.12.tgz#b9f396b0bf269c2985bb7fe99810a8e26d7288c3"
 | 
			
		||||
  integrity sha512-2IDhpzWVGeLHgsvIsX12RXvf78r7xBkc4QLoRUv3k7Cp61BisR1Ym1p0Tq9PbxT8fknlvLToh9n5RpmESi2d4w==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/time@^0.0.x":
 | 
			
		||||
  version "0.0.14"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/time/-/time-0.0.14.tgz#ea6daa438b1d3b019b99f5091117ee4bcef55d60"
 | 
			
		||||
  integrity sha512-1gMFCQTabMVIgww+k4g8HHHIhyy1tIlvwT8mC0BHW7Q7TzDAgobwL0bvor+lwvCb5LlDAvNQEpaRgVT99QWGeQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/cli" "^0.0.x"
 | 
			
		||||
    "@stdlib/constants" "^0.0.x"
 | 
			
		||||
    "@stdlib/fs" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/string" "^0.0.x"
 | 
			
		||||
    "@stdlib/utils" "^0.0.x"
 | 
			
		||||
 | 
			
		||||
"@stdlib/types@^0.0.x":
 | 
			
		||||
  version "0.0.14"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/types/-/types-0.0.14.tgz#02d3aab7a9bfaeb86e34ab749772ea22f7b2f7e0"
 | 
			
		||||
  integrity sha512-AP3EI9/il/xkwUazcoY+SbjtxHRrheXgSbWZdEGD+rWpEgj6n2i63hp6hTOpAB5NipE0tJwinQlDGOuQ1lCaCw==
 | 
			
		||||
 | 
			
		||||
"@stdlib/utils@^0.0.x":
 | 
			
		||||
  version "0.0.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@stdlib/utils/-/utils-0.0.12.tgz#670de5a7b253f04f11a4cba38f790e82393bcb46"
 | 
			
		||||
  integrity sha512-+JhFpl6l7RSq/xGnbWRQ5dAL90h9ONj8MViqlb7teBZFtePZLMwoRA1wssypFcJ8SFMRWQn7lPmpYVUkGwRSOg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@stdlib/array" "^0.0.x"
 | 
			
		||||
    "@stdlib/assert" "^0.0.x"
 | 
			
		||||
    "@stdlib/blas" "^0.0.x"
 | 
			
		||||
    "@stdlib/buffer" "^0.0.x"
 | 
			
		||||
    "@stdlib/cli" "^0.0.x"
 | 
			
		||||
    "@stdlib/constants" "^0.0.x"
 | 
			
		||||
    "@stdlib/fs" "^0.0.x"
 | 
			
		||||
    "@stdlib/math" "^0.0.x"
 | 
			
		||||
    "@stdlib/os" "^0.0.x"
 | 
			
		||||
    "@stdlib/process" "^0.0.x"
 | 
			
		||||
    "@stdlib/random" "^0.0.x"
 | 
			
		||||
    "@stdlib/regexp" "^0.0.x"
 | 
			
		||||
    "@stdlib/streams" "^0.0.x"
 | 
			
		||||
    "@stdlib/string" "^0.0.x"
 | 
			
		||||
    "@stdlib/symbol" "^0.0.x"
 | 
			
		||||
    "@stdlib/time" "^0.0.x"
 | 
			
		||||
    "@stdlib/types" "^0.0.x"
 | 
			
		||||
    debug "^2.6.9"
 | 
			
		||||
 | 
			
		||||
complex.js@^2.1.1:
 | 
			
		||||
  version "2.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/complex.js/-/complex.js-2.1.1.tgz#0675dac8e464ec431fb2ab7d30f41d889fb25c31"
 | 
			
		||||
  integrity sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==
 | 
			
		||||
 | 
			
		||||
core-util-is@~1.0.0:
 | 
			
		||||
  version "1.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
 | 
			
		||||
  integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
 | 
			
		||||
 | 
			
		||||
debug@^2.6.9:
 | 
			
		||||
  version "2.6.9"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
 | 
			
		||||
  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    ms "2.0.0"
 | 
			
		||||
 | 
			
		||||
decimal.js@^10.3.1:
 | 
			
		||||
  version "10.3.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
 | 
			
		||||
  integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
 | 
			
		||||
 | 
			
		||||
escape-latex@^1.2.0:
 | 
			
		||||
  version "1.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.2.0.tgz#07c03818cf7dac250cce517f4fda1b001ef2bca1"
 | 
			
		||||
  integrity sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==
 | 
			
		||||
 | 
			
		||||
fraction.js@^4.2.0:
 | 
			
		||||
  version "4.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950"
 | 
			
		||||
  integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==
 | 
			
		||||
 | 
			
		||||
inherits@~2.0.3:
 | 
			
		||||
  version "2.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
 | 
			
		||||
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 | 
			
		||||
 | 
			
		||||
isarray@~1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
 | 
			
		||||
  integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
 | 
			
		||||
 | 
			
		||||
javascript-natural-sort@^0.7.1:
 | 
			
		||||
  version "0.7.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59"
 | 
			
		||||
  integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==
 | 
			
		||||
 | 
			
		||||
jstat@^1.9.5:
 | 
			
		||||
  version "1.9.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/jstat/-/jstat-1.9.5.tgz#9941741566f683624ddeb56f5ba60ed8c29b374e"
 | 
			
		||||
  integrity sha512-cWnp4vObF5GmB2XsIEzxI/1ZTcYlcfNqxQ/9Fp5KFUa0Jf/4tO0ZkGVnqoEHDisJvYgvn5n3eWZbd2xTVJJPUQ==
 | 
			
		||||
 | 
			
		||||
lodash@^4.17.21:
 | 
			
		||||
  version "4.17.21"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
 | 
			
		||||
  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
 | 
			
		||||
 | 
			
		||||
mathjs@^10.6.0:
 | 
			
		||||
  version "10.6.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/mathjs/-/mathjs-10.6.1.tgz#95b34178eed65cbf7a63d35c468ad3ac912f7ddf"
 | 
			
		||||
  integrity sha512-8iZp6uUKKBoCFoUHze9ydsrSji9/IOEzMhwURyoQXaLL1+ILEZnraw4KzZnUBt/XN6lPJPV+7JO94oil3AmosQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@babel/runtime" "^7.18.3"
 | 
			
		||||
    complex.js "^2.1.1"
 | 
			
		||||
    decimal.js "^10.3.1"
 | 
			
		||||
    escape-latex "^1.2.0"
 | 
			
		||||
    fraction.js "^4.2.0"
 | 
			
		||||
    javascript-natural-sort "^0.7.1"
 | 
			
		||||
    seedrandom "^3.0.5"
 | 
			
		||||
    tiny-emitter "^2.1.0"
 | 
			
		||||
    typed-function "^2.1.0"
 | 
			
		||||
 | 
			
		||||
minimist@^1.2.0:
 | 
			
		||||
  version "1.2.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
 | 
			
		||||
  integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
 | 
			
		||||
 | 
			
		||||
ms@2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
 | 
			
		||||
  integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
 | 
			
		||||
 | 
			
		||||
pdfast@^0.2.0:
 | 
			
		||||
  version "0.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/pdfast/-/pdfast-0.2.0.tgz#8cbc556e1bf2522177787c0de2e0d4373ba885c9"
 | 
			
		||||
  integrity sha512-cq6TTu6qKSFUHwEahi68k/kqN2mfepjkGrG9Un70cgdRRKLKY6Rf8P8uvP2NvZktaQZNF3YE7agEkLj0vGK9bA==
 | 
			
		||||
 | 
			
		||||
process-nextick-args@~2.0.0:
 | 
			
		||||
  version "2.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
 | 
			
		||||
  integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
 | 
			
		||||
 | 
			
		||||
readable-stream@^2.1.4:
 | 
			
		||||
  version "2.3.7"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
 | 
			
		||||
  integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    core-util-is "~1.0.0"
 | 
			
		||||
    inherits "~2.0.3"
 | 
			
		||||
    isarray "~1.0.0"
 | 
			
		||||
    process-nextick-args "~2.0.0"
 | 
			
		||||
    safe-buffer "~5.1.1"
 | 
			
		||||
    string_decoder "~1.1.1"
 | 
			
		||||
    util-deprecate "~1.0.1"
 | 
			
		||||
 | 
			
		||||
regenerator-runtime@^0.13.4:
 | 
			
		||||
  version "0.13.9"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
 | 
			
		||||
  integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
 | 
			
		||||
 | 
			
		||||
rescript@^9.1.4:
 | 
			
		||||
  version "9.1.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/rescript/-/rescript-9.1.4.tgz#1eb126f98d6c16942c0bf0df67c050198e580515"
 | 
			
		||||
  integrity sha512-aXANK4IqecJzdnDpJUsU6pxMViCR5ogAxzuqS0mOr8TloMnzAjJFu63fjD6LCkWrKAhlMkFFzQvVQYaAaVkFXw==
 | 
			
		||||
 | 
			
		||||
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
 | 
			
		||||
  version "5.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
 | 
			
		||||
  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 | 
			
		||||
 | 
			
		||||
seedrandom@^3.0.5:
 | 
			
		||||
  version "3.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7"
 | 
			
		||||
  integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==
 | 
			
		||||
 | 
			
		||||
string_decoder@~1.1.1:
 | 
			
		||||
  version "1.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
 | 
			
		||||
  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    safe-buffer "~5.1.0"
 | 
			
		||||
 | 
			
		||||
tiny-emitter@^2.1.0:
 | 
			
		||||
  version "2.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
 | 
			
		||||
  integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
 | 
			
		||||
 | 
			
		||||
typed-function@^2.1.0:
 | 
			
		||||
  version "2.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-2.1.0.tgz#ded6f8a442ba8749ff3fe75bc41419c8d46ccc3f"
 | 
			
		||||
  integrity sha512-bctQIOqx2iVbWGDGPWwIm18QScpu2XRmkC19D8rQGFsjKSgteq/o1hTZvIG/wuDq8fanpBDrLkLq+aEN/6y5XQ==
 | 
			
		||||
 | 
			
		||||
util-deprecate@~1.0.1:
 | 
			
		||||
  version "1.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
 | 
			
		||||
  integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user