@brainpilot/skills 0.0.6

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.
Files changed (229) hide show
  1. package/dist/index.d.ts +6 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +28 -0
  4. package/dist/index.js.map +1 -0
  5. package/package.json +35 -0
  6. package/skills/01_Meta-Skills/contribute-skill/SKILL.md +277 -0
  7. package/skills/01_Meta-Skills/contribute-skills-via-pr/SKILL.md +163 -0
  8. package/skills/01_Meta-Skills/paper-to-skill/SKILL.md +435 -0
  9. package/skills/01_Meta-Skills/paper-to-skill/references/extraction-guide.md +286 -0
  10. package/skills/01_Meta-Skills/paper-to-skill/references/skill-template.md +250 -0
  11. package/skills/01_Meta-Skills/repo-to-skill/SKILL.md +289 -0
  12. package/skills/01_Meta-Skills/share-case/SKILL.md +253 -0
  13. package/skills/01_Meta-Skills/share-usage/README.md +63 -0
  14. package/skills/01_Meta-Skills/share-usage/SKILL.md +395 -0
  15. package/skills/01_Meta-Skills/verify-skill/SKILL.md +331 -0
  16. package/skills/02_Cross-Domain_Foundation/cogsci-power-analysis/SKILL.md +194 -0
  17. package/skills/02_Cross-Domain_Foundation/cogsci-power-analysis/references/effect-sizes.md +352 -0
  18. package/skills/02_Cross-Domain_Foundation/cogsci-power-analysis/references/sample-size-guide.md +407 -0
  19. package/skills/02_Cross-Domain_Foundation/cogsci-statistics/SKILL.md +361 -0
  20. package/skills/02_Cross-Domain_Foundation/cogsci-statistics/references/common-analyses.md +517 -0
  21. package/skills/02_Cross-Domain_Foundation/cogsci-visualization/SKILL.md +292 -0
  22. package/skills/02_Cross-Domain_Foundation/cogsci-visualization/references/plot-recipes.md +709 -0
  23. package/skills/02_Cross-Domain_Foundation/research-literacy/SKILL.md +286 -0
  24. package/skills/02_Cross-Domain_Foundation/research-literacy/references/common-assumptions.md +320 -0
  25. package/skills/02_Cross-Domain_Foundation/research-literacy/references/planning-template.md +143 -0
  26. package/skills/03_Cognitive_Psychology/alternative-uses-task-designer/SKILL.md +197 -0
  27. package/skills/03_Cognitive_Psychology/alternative-uses-task-designer/references/instruction-templates.md +60 -0
  28. package/skills/03_Cognitive_Psychology/cognitive-paradigm-design/SKILL.md +246 -0
  29. package/skills/03_Cognitive_Psychology/cognitive-paradigm-design/references/classic-paradigms.md +435 -0
  30. package/skills/03_Cognitive_Psychology/cognitive-paradigm-design/references/design-principles.md +256 -0
  31. package/skills/03_Cognitive_Psychology/creativity-self-efficacy-mediation/SKILL.md +270 -0
  32. package/skills/03_Cognitive_Psychology/creativity-self-efficacy-mediation/references/lavaan-templates.md +172 -0
  33. package/skills/03_Cognitive_Psychology/divergent-thinking-scoring/SKILL.md +238 -0
  34. package/skills/03_Cognitive_Psychology/divergent-thinking-scoring/references/scoring-rubric.md +143 -0
  35. package/skills/03_Cognitive_Psychology/drift-diffusion-model/SKILL.md +203 -0
  36. package/skills/03_Cognitive_Psychology/drift-diffusion-model/references/fitting-guide.md +571 -0
  37. package/skills/03_Cognitive_Psychology/drift-diffusion-model/references/model-variants.md +427 -0
  38. package/skills/03_Cognitive_Psychology/evidence-accumulation-selector/SKILL.md +310 -0
  39. package/skills/03_Cognitive_Psychology/evidence-accumulation-selector/references/ez-diffusion-formulas.md +137 -0
  40. package/skills/03_Cognitive_Psychology/signal-detection-analysis/SKILL.md +300 -0
  41. package/skills/03_Cognitive_Psychology/signal-detection-analysis/references/application-guide.md +278 -0
  42. package/skills/03_Cognitive_Psychology/signal-detection-analysis/references/sdt-formulas.md +318 -0
  43. package/skills/03_Cognitive_Psychology/visual-search-array-generator/SKILL.md +283 -0
  44. package/skills/03_Cognitive_Psychology/visual-search-array-generator/references/array-generation-parameters.yaml +111 -0
  45. package/skills/04_Psycholinguistics/reading-time-analysis/SKILL.md +301 -0
  46. package/skills/04_Psycholinguistics/reading-time-analysis/references/measure-computation-guide.md +195 -0
  47. package/skills/04_Psycholinguistics/self-paced-reading-designer/SKILL.md +257 -0
  48. package/skills/04_Psycholinguistics/self-paced-reading-designer/references/analysis-guide.md +356 -0
  49. package/skills/04_Psycholinguistics/self-paced-reading-designer/references/region-segmentation.md +266 -0
  50. package/skills/04_Psycholinguistics/sentence-stimulus-norming/SKILL.md +346 -0
  51. package/skills/04_Psycholinguistics/sentence-stimulus-norming/references/lexical-databases-guide.md +184 -0
  52. package/skills/05_EEG_ERP/eeg-paradigm-designer/SKILL.md +226 -0
  53. package/skills/05_EEG_ERP/eeg-paradigm-designer/references/component-paradigm-map.md +276 -0
  54. package/skills/05_EEG_ERP/eeg-paradigm-designer/references/timing-parameters.md +244 -0
  55. package/skills/05_EEG_ERP/eeg-preprocessing-pipeline-guide/SKILL.md +367 -0
  56. package/skills/05_EEG_ERP/eeg-preprocessing-pipeline-guide/references/parameter-lookup-tables.md +138 -0
  57. package/skills/05_EEG_ERP/erp-analysis/SKILL.md +185 -0
  58. package/skills/05_EEG_ERP/erp-analysis/references/erp-components.md +447 -0
  59. package/skills/05_EEG_ERP/erp-analysis/references/preprocessing-pipeline.md +277 -0
  60. package/skills/05_EEG_ERP/erp-analysis/references/statistical-approaches.md +351 -0
  61. package/skills/05_EEG_ERP/mne-python-guide/SKILL.md +174 -0
  62. package/skills/05_EEG_ERP/mne-python-guide/references/decoding.md +178 -0
  63. package/skills/05_EEG_ERP/mne-python-guide/references/io_formats.md +160 -0
  64. package/skills/05_EEG_ERP/mne-python-guide/references/preprocessing.md +259 -0
  65. package/skills/05_EEG_ERP/mne-python-guide/references/simulation.md +173 -0
  66. package/skills/05_EEG_ERP/mne-python-guide/references/source_localization.md +234 -0
  67. package/skills/05_EEG_ERP/mne-python-guide/references/statistics.md +196 -0
  68. package/skills/05_EEG_ERP/mne-python-guide/references/time_frequency.md +165 -0
  69. package/skills/05_EEG_ERP/mne-python-guide/references/visualization.md +175 -0
  70. package/skills/06_fMRI_Neuroimaging/brain-connectivity-modeler/SKILL.md +317 -0
  71. package/skills/06_fMRI_Neuroimaging/brain-connectivity-modeler/references/method-implementation-guide.md +116 -0
  72. package/skills/06_fMRI_Neuroimaging/fmri-glm-analysis-guide/SKILL.md +296 -0
  73. package/skills/06_fMRI_Neuroimaging/fmri-glm-analysis-guide/references/design-matrix-guide.md +214 -0
  74. package/skills/06_fMRI_Neuroimaging/fmri-glm-analysis-guide/references/statistical-inference.md +288 -0
  75. package/skills/06_fMRI_Neuroimaging/fmri-preprocessing-pipeline-guide/SKILL.md +274 -0
  76. package/skills/06_fMRI_Neuroimaging/fmri-preprocessing-pipeline-guide/references/quality-control.md +336 -0
  77. package/skills/06_fMRI_Neuroimaging/fmri-preprocessing-pipeline-guide/references/step-by-step-pipeline.md +380 -0
  78. package/skills/06_fMRI_Neuroimaging/fmri-task-design-guide/SKILL.md +264 -0
  79. package/skills/06_fMRI_Neuroimaging/fmri-task-design-guide/references/design-optimization-examples.md +114 -0
  80. package/skills/06_fMRI_Neuroimaging/neural-decoding-analysis/SKILL.md +273 -0
  81. package/skills/06_fMRI_Neuroimaging/neural-decoding-analysis/references/decoding-methods.md +170 -0
  82. package/skills/06_fMRI_Neuroimaging/neural-decoding-analysis/references/rsa-guide.md +266 -0
  83. package/skills/06_fMRI_Neuroimaging/pycortex-guide/SKILL.md +123 -0
  84. package/skills/06_fMRI_Neuroimaging/pycortex-guide/references/database-subjects.md +179 -0
  85. package/skills/06_fMRI_Neuroimaging/pycortex-guide/references/dataset-types.md +208 -0
  86. package/skills/06_fMRI_Neuroimaging/pycortex-guide/references/freesurfer-fmriprep.md +162 -0
  87. package/skills/06_fMRI_Neuroimaging/pycortex-guide/references/mapping-transforms.md +181 -0
  88. package/skills/06_fMRI_Neuroimaging/pycortex-guide/references/mni-utils.md +207 -0
  89. package/skills/06_fMRI_Neuroimaging/pycortex-guide/references/surface-analysis.md +219 -0
  90. package/skills/06_fMRI_Neuroimaging/pycortex-guide/references/visualization.md +251 -0
  91. package/skills/07_Computational_Modeling/act-r-model-builder/SKILL.md +297 -0
  92. package/skills/07_Computational_Modeling/act-r-model-builder/references/model-patterns.md +197 -0
  93. package/skills/07_Computational_Modeling/act-r-model-builder/references/parameter-table.yaml +204 -0
  94. package/skills/07_Computational_Modeling/bayesian-cognitive-model-builder/SKILL.md +294 -0
  95. package/skills/07_Computational_Modeling/bayesian-cognitive-model-builder/references/diagnostics-checklist.md +351 -0
  96. package/skills/07_Computational_Modeling/bayesian-cognitive-model-builder/references/prior-selection-guide.md +241 -0
  97. package/skills/07_Computational_Modeling/parameter-recovery-checker/SKILL.md +269 -0
  98. package/skills/07_Computational_Modeling/parameter-recovery-checker/references/recovery-diagnostics.md +207 -0
  99. package/skills/08_Computational_Neuroscience/brain-connectivity-modeler/SKILL.md +317 -0
  100. package/skills/08_Computational_Neuroscience/brain-connectivity-modeler/references/method-implementation-guide.md +116 -0
  101. package/skills/08_Computational_Neuroscience/neural-decoding-analysis/SKILL.md +273 -0
  102. package/skills/08_Computational_Neuroscience/neural-decoding-analysis/references/decoding-methods.md +170 -0
  103. package/skills/08_Computational_Neuroscience/neural-decoding-analysis/references/rsa-guide.md +266 -0
  104. package/skills/08_Computational_Neuroscience/neural-population-analysis-guide/SKILL.md +305 -0
  105. package/skills/08_Computational_Neuroscience/neural-population-analysis-guide/references/data-requirements.md +60 -0
  106. package/skills/08_Computational_Neuroscience/neural-population-analysis-guide/references/method-comparison.md +151 -0
  107. package/skills/08_Computational_Neuroscience/spiking-network-model-builder/SKILL.md +376 -0
  108. package/skills/08_Computational_Neuroscience/spiking-network-model-builder/references/hh-parameters.md +117 -0
  109. package/skills/08_Computational_Neuroscience/spiking-network-model-builder/references/network-regimes.md +130 -0
  110. package/skills/09_Cellular_Molecular_Neuroscience/calcium-imaging-analysis-guide/SKILL.md +258 -0
  111. package/skills/09_Cellular_Molecular_Neuroscience/calcium-imaging-analysis-guide/references/indicator-parameters.md +242 -0
  112. package/skills/09_Cellular_Molecular_Neuroscience/calcium-imaging-analysis-guide/references/pipeline-details.md +211 -0
  113. package/skills/09_Cellular_Molecular_Neuroscience/optogenetics-protocol-designer/SKILL.md +261 -0
  114. package/skills/09_Cellular_Molecular_Neuroscience/optogenetics-protocol-designer/references/opsin-catalog.md +124 -0
  115. package/skills/09_Cellular_Molecular_Neuroscience/optogenetics-protocol-designer/references/stimulation-parameters.md +304 -0
  116. package/skills/10_Clinical_Neuropsychology/lesion-symptom-mapping-guide/SKILL.md +367 -0
  117. package/skills/10_Clinical_Neuropsychology/lesion-symptom-mapping-guide/references/disconnection-guide.md +152 -0
  118. package/skills/10_Clinical_Neuropsychology/lesion-symptom-mapping-guide/references/vlsm-pipeline.md +182 -0
  119. package/skills/10_Clinical_Neuropsychology/neuropsych-battery-selector/SKILL.md +250 -0
  120. package/skills/10_Clinical_Neuropsychology/neuropsych-battery-selector/references/deficit-profiles.md +302 -0
  121. package/skills/10_Clinical_Neuropsychology/neuropsych-battery-selector/references/test-catalog.md +304 -0
  122. package/skills/11_Developmental_Cognition/infant-looking-time-designer/SKILL.md +345 -0
  123. package/skills/11_Developmental_Cognition/infant-looking-time-designer/references/age-parameters.yaml +186 -0
  124. package/skills/12_Social_Cognition/tom-task-selector/SKILL.md +379 -0
  125. package/skills/12_Social_Cognition/tom-task-selector/references/task-database.md +317 -0
  126. package/skills/13_Visualization/nature-figure/README.md +442 -0
  127. package/skills/13_Visualization/nature-figure/SKILL.md +60 -0
  128. package/skills/13_Visualization/nature-figure/assets/chart-atlas/atlas-01-bar-charts.png +0 -0
  129. package/skills/13_Visualization/nature-figure/assets/chart-atlas/atlas-02-line-trends.png +0 -0
  130. package/skills/13_Visualization/nature-figure/assets/chart-atlas/atlas-03-heatmaps.png +0 -0
  131. package/skills/13_Visualization/nature-figure/assets/chart-atlas/atlas-04-scatter-bubble.png +0 -0
  132. package/skills/13_Visualization/nature-figure/assets/chart-atlas/atlas-05-radar-polar.png +0 -0
  133. package/skills/13_Visualization/nature-figure/assets/chart-atlas/atlas-06-distributions.png +0 -0
  134. package/skills/13_Visualization/nature-figure/assets/chart-atlas/atlas-07-forest-interval.png +0 -0
  135. package/skills/13_Visualization/nature-figure/assets/chart-atlas/atlas-08-area-stacked.png +0 -0
  136. package/skills/13_Visualization/nature-figure/assets/chart-atlas/atlas-09-image-plates.png +0 -0
  137. package/skills/13_Visualization/nature-figure/assets/chart-atlas/atlas-10-network-matrix.png +0 -0
  138. package/skills/13_Visualization/nature-figure/assets/figures4papers/assets/Dispersion_motivation.png +0 -0
  139. package/skills/13_Visualization/nature-figure/assets/figures4papers/assets/Dispersion_observation.png +0 -0
  140. package/skills/13_Visualization/nature-figure/assets/figures4papers/assets/Dispersion_observation_distillation.png +0 -0
  141. package/skills/13_Visualization/nature-figure/assets/figures4papers/assets/ImmunoStruct_contrastive.png +0 -0
  142. package/skills/13_Visualization/nature-figure/assets/figures4papers/assets/ImmunoStruct_results_CEDAR.png +0 -0
  143. package/skills/13_Visualization/nature-figure/assets/figures4papers/assets/ImmunoStruct_results_IEDB.png +0 -0
  144. package/skills/13_Visualization/nature-figure/assets/figures4papers/assets/ImmunoStruct_schematic.png +0 -0
  145. package/skills/13_Visualization/nature-figure/assets/figures4papers/assets/RNAGenScape_schematic.png +0 -0
  146. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_CellSpliceNet/figures/ablation.png +0 -0
  147. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_CellSpliceNet/figures/comparison.png +0 -0
  148. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_CellSpliceNet/plot_ablation.py +86 -0
  149. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_CellSpliceNet/plot_comparison.py +109 -0
  150. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Cflows/diffusion_swiss_roll.py +97 -0
  151. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Cflows/figures/diffusion_swiss_roll.png +0 -0
  152. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Cflows/figures/fig2_comparison_GeneRegulatory.pdf +0 -0
  153. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Cflows/figures/fig2_comparison_GeneRegulatory.png +0 -0
  154. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Cflows/figures/fig2_comparison_Trajectory.pdf +0 -0
  155. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Cflows/figures/fig2_comparison_Trajectory.png +0 -0
  156. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Cflows/figures/figX_comparison_Ablation.pdf +0 -0
  157. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Cflows/figures/figX_comparison_Ablation.png +0 -0
  158. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Cflows/plot_comparison_Ablation.py +64 -0
  159. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Cflows/plot_comparison_GeneRegulatory.py +74 -0
  160. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Cflows/plot_comparison_Trajectory.py +74 -0
  161. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Dispersion/figures/idea.png +0 -0
  162. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Dispersion/figures/illustration.png +0 -0
  163. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Dispersion/plot_idea.py +76 -0
  164. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_Dispersion/plot_illustration.py +404 -0
  165. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_FPGM/figures/freq_prior.png +0 -0
  166. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_FPGM/plot_freq_prior.py +146 -0
  167. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_ImmunoStruct/figures/bars_ablation_Cancer.png +0 -0
  168. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_ImmunoStruct/figures/bars_ablation_IEDB.png +0 -0
  169. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_ImmunoStruct/figures/bars_comparison_Cancer.png +0 -0
  170. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_ImmunoStruct/figures/bars_comparison_IEDB.png +0 -0
  171. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_ImmunoStruct/plot_bars.py +216 -0
  172. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_ImmunoStruct/raw_data.py +125 -0
  173. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_RNAGenScape/figures/manifold.png +0 -0
  174. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_RNAGenScape/figures/manifold_holes.png +0 -0
  175. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_RNAGenScape/figures/results_comparison_optimization.png +0 -0
  176. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_RNAGenScape/figures/results_comparison_speed.png +0 -0
  177. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_RNAGenScape/figures/results_sweep.png +0 -0
  178. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_RNAGenScape/plot_comparison.py +228 -0
  179. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_RNAGenScape/plot_hole_manifold.py +82 -0
  180. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_RNAGenScape/plot_manifold.py +61 -0
  181. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_RNAGenScape/plot_sweep.py +77 -0
  182. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_VIGIL/figures/comparison_posttraining.png +0 -0
  183. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_VIGIL/figures/comparison_radar.png +0 -0
  184. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_VIGIL/plot_comparison_radar.py +173 -0
  185. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_VIGIL/plot_posttraining.py +82 -0
  186. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_brainteaser/figures/brute_force.png +0 -0
  187. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_brainteaser/figures/correctness_by_category.png +0 -0
  188. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_brainteaser/figures/correctness_by_subcategory.png +0 -0
  189. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_brainteaser/figures/rewriting.png +0 -0
  190. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_brainteaser/figures/selfcorrection_math.png +0 -0
  191. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_brainteaser/plot_brute_force.py +248 -0
  192. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_brainteaser/plot_correctness_by_category.py +132 -0
  193. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_brainteaser/plot_correctness_by_subcategory.py +131 -0
  194. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_brainteaser/plot_rewriting.py +105 -0
  195. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_brainteaser/plot_selfcorrection_math.py +99 -0
  196. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_ophthal_review/figures/composition_heatmap.png +0 -0
  197. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_ophthal_review/figures/trend_by_month.png +0 -0
  198. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_ophthal_review/plot_composition.py +81 -0
  199. package/skills/13_Visualization/nature-figure/assets/figures4papers/figure_ophthal_review/plot_trend.py +125 -0
  200. package/skills/13_Visualization/nature-figure/assets/gallery/fig1-material-mechanism-rich.png +0 -0
  201. package/skills/13_Visualization/nature-figure/assets/gallery/fig2-spatial-imaging-rich.png +0 -0
  202. package/skills/13_Visualization/nature-figure/assets/gallery/fig3-in-vivo-efficacy-rich.png +0 -0
  203. package/skills/13_Visualization/nature-figure/assets/gallery/fig4-single-cell-systems-rich.png +0 -0
  204. package/skills/13_Visualization/nature-figure/assets/gallery/fig5-validation-perturbation-rich.png +0 -0
  205. package/skills/13_Visualization/nature-figure/evals/evals.json +37 -0
  206. package/skills/13_Visualization/nature-figure/manifest.yaml +57 -0
  207. package/skills/13_Visualization/nature-figure/references/api.md +428 -0
  208. package/skills/13_Visualization/nature-figure/references/backend-selection.md +100 -0
  209. package/skills/13_Visualization/nature-figure/references/chart-types.md +281 -0
  210. package/skills/13_Visualization/nature-figure/references/common-patterns.md +350 -0
  211. package/skills/13_Visualization/nature-figure/references/demos.md +65 -0
  212. package/skills/13_Visualization/nature-figure/references/design-theory.md +436 -0
  213. package/skills/13_Visualization/nature-figure/references/figure-contract.md +93 -0
  214. package/skills/13_Visualization/nature-figure/references/nature-2026-observations.md +112 -0
  215. package/skills/13_Visualization/nature-figure/references/qa-contract.md +119 -0
  216. package/skills/13_Visualization/nature-figure/references/r-template-index.md +66 -0
  217. package/skills/13_Visualization/nature-figure/references/r-workflow.md +161 -0
  218. package/skills/13_Visualization/nature-figure/references/tutorials.md +251 -0
  219. package/skills/13_Visualization/nature-figure/static/core/contract.md +29 -0
  220. package/skills/13_Visualization/nature-figure/static/core/stance.md +37 -0
  221. package/skills/13_Visualization/nature-figure/static/fragments/backend/python.md +37 -0
  222. package/skills/13_Visualization/nature-figure/static/fragments/backend/r.md +44 -0
  223. package/skills/14_Writing/markdown-report-writing/SKILL.md +306 -0
  224. package/skills/14_Writing/markdown-report-writing/references/compatibility-matrix.md +72 -0
  225. package/skills/14_Writing/markdown-report-writing/references/templates.md +299 -0
  226. package/skills/15_Others/neuroimaging-power-guide/SKILL.md +324 -0
  227. package/skills/15_Others/neuroimaging-power-guide/references/effect-size-lookup-tables.md +102 -0
  228. package/skills/15_Others/neuroimaging-sample-size-calculator/SKILL.md +330 -0
  229. package/skills/15_Others/neuroimaging-sample-size-calculator/references/worked-examples.md +220 -0
@@ -0,0 +1,109 @@
1
+ import os
2
+ import numpy as np
3
+ from matplotlib import pyplot as plt
4
+ from matplotlib import gridspec as gridspec
5
+
6
+
7
+ data_ablation = {
8
+ 'methods': [
9
+ r'CellSpliceNet',
10
+ r'ViT',
11
+ r'SpliceFinder',
12
+ r'Pangolin',
13
+ r'SpliceTransformer',
14
+ r'SpliceAI',
15
+ r'ESM2',
16
+ ],
17
+ 'colors': ['#0F4D92', "#F09F97", "#F1B3AC", "#EFBEB8", "#F0CDC8", "#F3D9D8", '#FCEEED'],
18
+ 'metrics': [r'Spearman correlation', r'Pearson correlation', r'R$^2$ score'],
19
+ 'result': {
20
+ # r'Spearman correlation': np.array([0.88, 0.81, 0.80, 0.79, 0.77, 0.71, 0.606]),
21
+ # r'Pearson correlation': np.array([0.88, 0.81, 0.80, 0.79, 0.77, 0.72, 0.613]),
22
+ # r'R$^2$ score': np.array([0.77, 0.66, 0.64, 0.62, 0.59, 0.52, 0.369]),
23
+ r'Spearman correlation': np.array([
24
+ [0.88, 0.88, 0.88], # TODO: update!
25
+ [0.81, 0.81, 0.81], # TODO: update!
26
+ [0.806, 0.793, 0.794],
27
+ [0.792, 0.785, 0.788],
28
+ [0.765, 0.765, 0.767],
29
+ [0.714, 0.716, 0.706],
30
+ [0.598, 0.625, 0.594],
31
+ ]),
32
+ r'Pearson correlation': np.array([
33
+ [0.88, 0.88, 0.88], # TODO: update!
34
+ [0.81, 0.81, 0.81], # TODO: update!
35
+ [0.812, 0.798, 0.801],
36
+ [0.792, 0.785, 0.788],
37
+ [0.765, 0.765, 0.766],
38
+ [0.722, 0.722, 0.714],
39
+ [0.604, 0.631, 0.605],
40
+ ]),
41
+ r'R$^2$ score': np.array([
42
+ [0.77, 0.77, 0.77], # TODO: update!
43
+ [0.66, 0.66, 0.66], # TODO: update!
44
+ [0.658, 0.632, 0.642],
45
+ [0.633, 0.615, 0.627],
46
+ [0.585, 0.585, 0.586],
47
+ [0.518, 0.520, 0.507],
48
+ [0.359, 0.384, 0.364],
49
+ ]),
50
+ }
51
+ }
52
+
53
+ def is_dark(color_in_hex, threshold=128):
54
+ color = color_in_hex.lstrip('#')
55
+ r = int(color[0:2], 16)
56
+ g = int(color[2:4], 16)
57
+ b = int(color[4:6], 16)
58
+
59
+ luminance = 0.299*r + 0.587*g + 0.114*b
60
+ return luminance < threshold
61
+
62
+
63
+ if __name__ == '__main__':
64
+ plt.rcParams['font.family'] = 'helvetica'
65
+ plt.rcParams['font.size'] = 24
66
+ plt.rcParams['axes.spines.right'] = False
67
+ plt.rcParams['axes.spines.top'] = False
68
+ plt.rcParams['axes.linewidth'] = 3
69
+
70
+ fig = plt.figure(figsize=(45, 12))
71
+
72
+ gs = gridspec.GridSpec(1, 3)
73
+
74
+ for metric_idx, metric_name in enumerate(data_ablation['metrics']):
75
+ ax = fig.add_subplot(gs[metric_idx])
76
+
77
+ num_methods = len(data_ablation['methods'])
78
+ bars = ax.bar(
79
+ np.arange(num_methods),
80
+ data_ablation['result'][metric_name].mean(axis=1),
81
+ yerr=data_ablation['result'][metric_name].std(axis=1),
82
+ error_kw={
83
+ 'elinewidth': 2, # thickness of vertical error bar line
84
+ 'capthick': 2, # thickness of caps
85
+ 'capsize': 15 # length of caps
86
+ },
87
+ color=data_ablation['colors'],
88
+ label=data_ablation['methods'],
89
+ )
90
+
91
+ for i, (bar, value) in enumerate(zip(bars, data_ablation['result'][metric_name].mean(axis=1))):
92
+ textcolor = 'white' if is_dark(data_ablation['colors'][i]) else 'black'
93
+ ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() - 0.10,
94
+ f'{value:.2f}', ha='center', va='bottom', fontsize=32, color=textcolor)
95
+
96
+ ax.set_ylabel(metric_name, fontsize=54, labelpad=12)
97
+ ymax = np.max(data_ablation['result'][metric_name])
98
+ ax.set_ylim([0.0, ymax + 0.5])
99
+ ax.set_xticks([])
100
+ ax.set_yticks([0.00, 0.25, 0.50, 0.75, 1.00])
101
+ ax.tick_params(axis='y', labelsize=36, length=10, width=2)
102
+
103
+ ax.legend(bbox_to_anchor=(0.02, 1.08), loc='upper left', fontsize=38, frameon=False, ncols=2, columnspacing=0.6)
104
+
105
+ fig.tight_layout(pad=2)
106
+
107
+ os.makedirs('./figures/', exist_ok=True)
108
+ fig.savefig('./figures/comparison.png', dpi=300)
109
+ plt.close(fig)
@@ -0,0 +1,97 @@
1
+ import numpy as np
2
+ import matplotlib.pyplot as plt
3
+ from scipy.spatial.distance import pdist, squareform
4
+
5
+ # Generate Swiss Roll data
6
+ def generate_swiss_roll_2d(n_samples=80, noise=0.1):
7
+ t = 1.5 * np.pi * (1 + 2 * np.random.rand(n_samples))
8
+ x = t * np.cos(t)
9
+ z = t * np.sin(t)
10
+
11
+ # Add some noise
12
+ x += noise * np.random.randn(n_samples)
13
+ z += noise * np.random.randn(n_samples)
14
+
15
+ return x, z, t
16
+
17
+ # Compute diffusion matrix (transition probabilities)
18
+ def compute_diffusion_matrix(x, z, t, sigma=1.0):
19
+ # Order points by manifold parameter t for better matrix visualization
20
+ sorted_indices = np.argsort(t)
21
+ x_sorted = x[sorted_indices]
22
+ z_sorted = z[sorted_indices]
23
+ t_sorted = t[sorted_indices]
24
+
25
+ # Compute pairwise distances in ambient space
26
+ points = np.column_stack([x_sorted, z_sorted])
27
+ distances = squareform(pdist(points))
28
+
29
+ # Compute manifold distances (along parameter t)
30
+ t_distances = np.abs(t_sorted[:, None] - t_sorted[None, :])
31
+
32
+ # Combine spatial and manifold distances (emphasize manifold structure)
33
+ combined_distances = distances + 0.5 * t_distances
34
+
35
+ # Gaussian kernel for transition probabilities
36
+ P = np.exp(-combined_distances**2 / (2 * sigma**2))
37
+
38
+ # Make matrix sparser by thresholding small values
39
+ P[P < 0.01] = 0
40
+
41
+ # Normalize rows to make it a proper transition matrix
42
+ row_sums = P.sum(axis=1)
43
+ row_sums[row_sums == 0] = 1 # Avoid division by zero
44
+ P = P / row_sums[:, None]
45
+
46
+ return P, sorted_indices
47
+
48
+ if __name__ == '__main__':
49
+ # Create two subplots
50
+ fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 8))
51
+
52
+ # Generate swiss roll point cloud (smaller for visualization clarity)
53
+ x, z, t = generate_swiss_roll_2d(n_samples=500, noise=0.5)
54
+
55
+ # Compute diffusion matrix
56
+ P, sorted_indices = compute_diffusion_matrix(x, z, t, sigma=2)
57
+
58
+ # Left plot: Diffusion Matrix
59
+ im = ax1.imshow(P, cmap='Reds', aspect='equal', origin='upper')
60
+ ax1.axis('off')
61
+ ax1.set_facecolor('white')
62
+
63
+ # Right plot: Swiss Roll with probability-weighted connections
64
+ # Use original (unsorted) coordinates for the swiss roll plot
65
+ x_orig, z_orig, t_orig = x, z, t
66
+
67
+ # Draw line segments between points with opacity = transition probability
68
+ threshold = 0.02 # Only draw lines above this probability threshold
69
+
70
+ for i in range(len(x_orig)):
71
+ for j in range(i+1, len(x_orig)):
72
+ # Find corresponding indices in sorted matrix
73
+ orig_i_in_sorted = np.where(sorted_indices == i)[0][0]
74
+ orig_j_in_sorted = np.where(sorted_indices == j)[0][0]
75
+
76
+ # Get transition probability from matrix
77
+ prob = max(P[orig_i_in_sorted, orig_j_in_sorted], P[orig_j_in_sorted, orig_i_in_sorted])
78
+
79
+ if prob > threshold:
80
+ ax2.plot([x_orig[i], x_orig[j]], [z_orig[i], z_orig[j]],
81
+ color='black', linewidth=2, alpha=prob*2, zorder=1)
82
+
83
+ # Plot the swiss roll points on top
84
+ scatter = ax2.scatter(x_orig, z_orig, c=t_orig, cmap='viridis', s=100,
85
+ alpha=0.5, edgecolors='white', linewidth=1, zorder=2)
86
+
87
+ # Styling for swiss roll plot
88
+ ax2.set_aspect('equal')
89
+ ax2.axis('off')
90
+ ax2.set_facecolor('white')
91
+
92
+ # Clean overall styling
93
+ fig.patch.set_facecolor('white')
94
+ plt.subplots_adjust(left=0, right=1, top=1, bottom=0, wspace=0.02)
95
+
96
+ plt.savefig('figures/diffusion_swiss_roll.png', dpi=300, bbox_inches='tight',
97
+ facecolor='white', edgecolor='none', pad_inches=1)
@@ -0,0 +1,64 @@
1
+ import os
2
+ import numpy as np
3
+ from matplotlib import pyplot as plt
4
+
5
+
6
+ data_comparison_Ablation = {
7
+ 'methods': [r'OT-CFM', r'SB-CFM', r'SF2M', r'Cflows (w/o growth + energy)', r'Cflows (w/o growth)', r'Cflows'],
8
+ 'colors': ['#AADCA9', '#8BCF8B', '#E9A6A1', '#B8C9E5', '#7097CA', '#3775BA'],
9
+ 'metrics': [r'RMSE$\downarrow$', r'MAE$\downarrow$', r'PCC$\uparrow$', r'SCC$\uparrow$'],
10
+ 'mean': {
11
+ r'RMSE$\downarrow$': np.array([0.94, 1.05, 0.99, 0.89, 0.75, 0.62]),
12
+ r'MAE$\downarrow$': np.array([0.75, 0.85, 0.78, 0.70, 0.59, 0.48]),
13
+ r'PCC$\uparrow$': np.array([0.53, 0.49, 0.55, 0.58, 0.65, 0.72]),
14
+ r'SCC$\uparrow$': np.array([0.50, 0.47, 0.52, 0.55, 0.68, 0.70]),
15
+ },
16
+ 'std': {
17
+ r'RMSE$\downarrow$': np.array([0.08, 0.09, 0.09, 0.07, 0.06, 0.05]),
18
+ r'MAE$\downarrow$': np.array([0.07, 0.08, 0.07, 0.06, 0.05, 0.04]),
19
+ r'PCC$\uparrow$': np.array([0.04, 0.02, 0.01, 0.03, 0.02, 0.02]),
20
+ r'SCC$\uparrow$': np.array([0.03, 0.02, 0.03, 0.03, 0.03, 0.01]),
21
+ },
22
+ }
23
+
24
+
25
+ if __name__ == '__main__':
26
+ plt.rcParams['font.family'] = 'helvetica'
27
+ plt.rcParams['font.size'] = 24
28
+ plt.rcParams['axes.spines.right'] = False
29
+ plt.rcParams['axes.spines.top'] = False
30
+ plt.rcParams['axes.linewidth'] = 3
31
+
32
+ fig = plt.figure(figsize=(35, 7))
33
+
34
+ num_methods = len(data_comparison_Ablation['methods'])
35
+ for metric_idx, metric_name in enumerate(data_comparison_Ablation['metrics']):
36
+ ax = fig.add_subplot(1, 5, metric_idx + 1)
37
+
38
+ ax.bar(
39
+ np.arange(num_methods),
40
+ data_comparison_Ablation['mean'][metric_name],
41
+ yerr=data_comparison_Ablation['std'][metric_name],
42
+ capsize=8,
43
+ error_kw={'capthick': 2},
44
+ color=data_comparison_Ablation['colors'],
45
+ label=data_comparison_Ablation['methods'],
46
+ )
47
+
48
+ if metric_idx == 0:
49
+ handles, labels = ax.get_legend_handles_labels()
50
+
51
+ ax.set_xticks([])
52
+ ax.set_ylabel(data_comparison_Ablation['metrics'][metric_idx], fontsize=36, labelpad=12)
53
+ ax.ticklabel_format(axis='y', style='sci', scilimits=(0, 0))
54
+
55
+ ax = fig.add_subplot(1, 5, 5)
56
+ ax.legend(handles, labels, fontsize=30, loc='lower left', frameon=False)
57
+ ax.set_axis_off()
58
+
59
+ fig.tight_layout(pad=2)
60
+
61
+ os.makedirs('./figures/', exist_ok=True)
62
+ fig.savefig('./figures/figX_comparison_Ablation.png', dpi=300)
63
+ fig.savefig('./figures/figX_comparison_Ablation.pdf', dpi=300)
64
+ plt.close(fig)
@@ -0,0 +1,74 @@
1
+ import os
2
+ import numpy as np
3
+ from matplotlib import pyplot as plt
4
+
5
+
6
+ data_comparison_GeneRegulatory = {
7
+ 'methods': [r'OCE', r'PC', r'mTE', r'mMI', r'NRI', r'DCRNN', r'GTS', r'NIR', r'GC (ours)'],
8
+ 'colors': ['#D0A3A3', '#EFE7B1', '#F4C2C2', '#D7C4E2', '#E5C09F', '#A8C6C2', '#B7D3B0', '#F5B5A0', '#3775BA'],
9
+ 'metric': 'Graph Edit Distance',
10
+ 'datasets': [
11
+ r'($|\mathcal{V}|$, $|\mathcal{E}|$) = (100, 137)',
12
+ r'($|\mathcal{V}|$, $|\mathcal{E}|$) = (150, 329)',
13
+ r'($|\mathcal{V}|$, $|\mathcal{E}|$) = (200, 507)',
14
+ ],
15
+ 'mean': {
16
+ r'($|\mathcal{V}|$, $|\mathcal{E}|$) = (100, 137)':
17
+ np.array([138.6, 140.4, 126.4, 51.2, 72.1, 158.14, 215.4, 62.7, 51.2]),
18
+ r'($|\mathcal{V}|$, $|\mathcal{E}|$) = (150, 329)':
19
+ np.array([293.4, 317.2, 261.0, 99.8, 106.6, 303.79, 347.2, 86.3, 109.0]),
20
+ r'($|\mathcal{V}|$, $|\mathcal{E}|$) = (200, 507)':
21
+ np.array([449.8, 495.6, 397.4, 162.8, 219.8, 508.25, 481.8, 159.2, 158.8]),
22
+ },
23
+ 'std': {
24
+ r'($|\mathcal{V}|$, $|\mathcal{E}|$) = (100, 137)':
25
+ np.array([3.5, 3.9, 2.4, 3.3, 6.2, 8.6, 13.8, 3.2, 3.3]),
26
+ r'($|\mathcal{V}|$, $|\mathcal{E}|$) = (150, 329)':
27
+ np.array([2.9, 3.7, 2.2, 4.0, 5.4, 12.4, 19.3, 2.8, 6.4]),
28
+ r'($|\mathcal{V}|$, $|\mathcal{E}|$) = (200, 507)':
29
+ np.array([1.1, 6.5, 8.8, 6.2, 13.4, 23.6, 7.0, 11.6, 12.6]),
30
+ },
31
+ }
32
+
33
+
34
+ if __name__ == '__main__':
35
+ plt.rcParams['font.family'] = 'helvetica'
36
+ plt.rcParams['font.size'] = 24
37
+ plt.rcParams['axes.spines.right'] = False
38
+ plt.rcParams['axes.spines.top'] = False
39
+ plt.rcParams['axes.linewidth'] = 3
40
+
41
+ fig = plt.figure(figsize=(36, 6))
42
+
43
+ num_methods = len(data_comparison_GeneRegulatory['methods'])
44
+ for dataset_idx, dataset_name in enumerate(data_comparison_GeneRegulatory['datasets']):
45
+ ax = fig.add_subplot(1, 4, dataset_idx + 1)
46
+
47
+ ax.bar(
48
+ np.arange(num_methods),
49
+ data_comparison_GeneRegulatory['mean'][dataset_name],
50
+ yerr=data_comparison_GeneRegulatory['std'][dataset_name],
51
+ capsize=8,
52
+ error_kw={'capthick': 2},
53
+ color=data_comparison_GeneRegulatory['colors'],
54
+ label=data_comparison_GeneRegulatory['methods'],
55
+ )
56
+
57
+ if dataset_idx == 0:
58
+ handles, labels = ax.get_legend_handles_labels()
59
+
60
+ ax.set_xticks([])
61
+ ax.set_ylabel(data_comparison_GeneRegulatory['metric'], fontsize=36, labelpad=12)
62
+ ax.set_xlabel(dataset_name, fontsize=36, labelpad=12)
63
+ ax.ticklabel_format(axis='y', style='sci', scilimits=(0, 0))
64
+
65
+ ax = fig.add_subplot(1, 4, 4)
66
+ ax.legend(handles, labels, fontsize=30, loc='lower left', ncols=2, frameon=False)
67
+ ax.set_axis_off()
68
+
69
+ fig.tight_layout(pad=2)
70
+
71
+ os.makedirs('./figures/', exist_ok=True)
72
+ fig.savefig('./figures/fig2_comparison_GeneRegulatory.png', dpi=300)
73
+ fig.savefig('./figures/fig2_comparison_GeneRegulatory.pdf', dpi=300)
74
+ plt.close(fig)
@@ -0,0 +1,74 @@
1
+ import os
2
+ import numpy as np
3
+ from matplotlib import pyplot as plt
4
+
5
+
6
+ data_comparison_Trajectory = {
7
+ 'methods': [r'TrajectoryNet', r'OT-CFM', r'SB-CFM', r'BEMIOflow (ours)'],
8
+ 'colors': ['#DDF3DE', '#AADCA9', '#8BCF8B', '#3775BA'],
9
+ 'metrics': ['PHATE Space RMSE', 'Gene Space RMSE', 'Interpolation EMD'],
10
+ 'datasets': ['Bifurcation', 'Cycle', 'Unidirectional'],
11
+ 'mean': {
12
+ 'PHATE Space RMSE': {
13
+ 'Bifurcation': np.array([6.16, 2.98, 2.83, 2.60]) * 1e-3,
14
+ 'Cycle': np.array([2.49, 3.79, 1.58, 0.777]) * 1e-3,
15
+ 'Unidirectional': np.array([8.08, 5.33, 5.67, 3.40]) * 1e-3,
16
+ },
17
+ 'Gene Space RMSE': {
18
+ 'Bifurcation': np.array([0.150, 0.0842, 0.0835, 0.0773]),
19
+ 'Cycle': np.array([0.151, 0.209, 0.141, 0.118]),
20
+ 'Unidirectional': np.array([0.118, 0.0960, 0.0978, 0.0853]),
21
+ },
22
+ 'Interpolation EMD': {
23
+ 'Bifurcation': np.array([1.07, 0.495, 0.516, 0.465]) * 1e-2,
24
+ 'Cycle': np.array([0.710, 0.818, 0.526, 0.465]) * 1e-2,
25
+ 'Unidirectional': np.array([1.50, 1.32, 1.28, 0.935]) * 1e-2,
26
+ },
27
+ },
28
+ }
29
+
30
+
31
+ if __name__ == '__main__':
32
+ plt.rcParams['font.family'] = 'helvetica'
33
+ plt.rcParams['font.size'] = 24
34
+ plt.rcParams['axes.spines.right'] = False
35
+ plt.rcParams['axes.spines.top'] = False
36
+ plt.rcParams['axes.linewidth'] = 3
37
+
38
+ fig = plt.figure(figsize=(36, 6))
39
+
40
+ num_methods = len(data_comparison_Trajectory['methods'])
41
+ for metric_idx, metric_name in enumerate(data_comparison_Trajectory['metrics']):
42
+ ax = fig.add_subplot(1, 4, metric_idx + 1)
43
+ xtick_list = []
44
+
45
+ for dataset_idx, dataset_name in enumerate(data_comparison_Trajectory['datasets']):
46
+
47
+ ax.bar(
48
+ np.arange(num_methods) + dataset_idx * (num_methods + 1),
49
+ data_comparison_Trajectory['mean'][metric_name][dataset_name],
50
+ color=data_comparison_Trajectory['colors'],
51
+ label=data_comparison_Trajectory['methods'],
52
+ )
53
+
54
+ xtick_list.append(np.mean(np.arange(num_methods)) + dataset_idx * (num_methods + 1))
55
+
56
+ if dataset_idx == 0:
57
+ handles, labels = ax.get_legend_handles_labels()
58
+
59
+ ax.set_xticks(xtick_list)
60
+ ax.set_xticklabels(data_comparison_Trajectory['datasets'])
61
+ ax.set_ylabel(data_comparison_Trajectory['metrics'][metric_idx], fontsize=36, labelpad=12)
62
+ ax.set_xlabel('Dataset', fontsize=36, labelpad=12)
63
+ ax.ticklabel_format(axis='y', style='sci', scilimits=(0, 0))
64
+
65
+ ax = fig.add_subplot(1, 4, 4)
66
+ ax.legend(handles, labels, fontsize=30, loc='lower left', frameon=False)
67
+ ax.set_axis_off()
68
+
69
+ fig.tight_layout(pad=2)
70
+
71
+ os.makedirs('./figures/', exist_ok=True)
72
+ fig.savefig('./figures/fig2_comparison_Trajectory.png', dpi=300)
73
+ fig.savefig('./figures/fig2_comparison_Trajectory.pdf', dpi=300)
74
+ plt.close(fig)
@@ -0,0 +1,76 @@
1
+ import os
2
+ import numpy as np
3
+ import matplotlib.pyplot as plt
4
+
5
+
6
+ EPSILON = 1e-6
7
+
8
+ def sample_points_in_ball(num_points, theta_range=2*np.pi):
9
+ r = np.sqrt(np.random.uniform(0, 0.95, num_points))
10
+ theta = np.random.uniform(np.pi/2 - theta_range/2, np.pi/2 + theta_range/2, num_points)
11
+ x = r * np.cos(theta)
12
+ y = r * np.sin(theta)
13
+ return np.stack([x, y], axis=1)
14
+
15
+ def plot_ball_with_points(ax, pts, facecolor):
16
+ num_points_grid = 512
17
+
18
+ xs = np.linspace(-1, 1, num_points_grid)
19
+ ys = np.linspace(-1, 1, num_points_grid)
20
+ x, y = np.meshgrid(xs, ys)
21
+ r2 = x**2 + y**2
22
+ mask = r2 <= 1.0
23
+ z = np.zeros_like(x)
24
+ z[mask] = np.sqrt(1.0 - r2[mask])
25
+
26
+ nx, ny, nz = x.copy(), y.copy(), z.copy()
27
+ norm = np.sqrt(nx**2 + ny**2 + nz**2) + EPSILON
28
+ nx, ny, nz = nx / norm, ny / norm, nz / norm
29
+
30
+ # light from top left.
31
+ light_dir = np.array([-0.5, 0.5, 0.8])
32
+ light_dir /= np.linalg.norm(light_dir)
33
+ intensity = np.maximum(0.0, nx*light_dir[0] + ny*light_dir[1] + nz*light_dir[2])
34
+ shade = np.clip(-0.5 + 2.0*intensity, 0, 1)
35
+
36
+ img = np.ones((num_points_grid, num_points_grid))
37
+ img[mask] = shade[mask]
38
+
39
+ ax.imshow(img, cmap='gray', origin='lower', extent=[-1, 1, -1, 1], vmin=0, vmax=1, alpha=0.3)
40
+ ax.set_xlim([-2, 2])
41
+ ax.set_ylim([-2, 2])
42
+ ax.set_axis_off()
43
+
44
+ # add points on sphere.
45
+ ax.scatter(pts[:, 0], pts[:, 1], s=80, facecolor=facecolor, edgecolor='black', alpha=0.8)
46
+ for i in range(pts.shape[0]):
47
+ ax.plot([pts[i, 0], 0], [pts[i, 1], 0],
48
+ linestyle="--", color="black", linewidth=1, alpha=0.8)
49
+
50
+ return ax
51
+
52
+
53
+ if __name__ == "__main__":
54
+ save_path = './figures/idea.png'
55
+ num_points = 16
56
+
57
+ np.random.seed(1)
58
+ plt.rcParams['text.usetex'] = True
59
+ plt.rcParams['font.family'] = 'sans-serif'
60
+ fig = plt.figure(figsize=(18, 6))
61
+
62
+ ax = fig.add_subplot(1, 3, 1)
63
+ pts = sample_points_in_ball(num_points=num_points)
64
+ plot_ball_with_points(ax, pts, facecolor='#cde5f8')
65
+
66
+ ax = fig.add_subplot(1, 3, 2)
67
+ pts = sample_points_in_ball(num_points=num_points, theta_range=np.pi/4)
68
+ plot_ball_with_points(ax, pts, facecolor='#6a98cb')
69
+
70
+ ax = fig.add_subplot(1, 3, 3)
71
+ pts = sample_points_in_ball(num_points=num_points)
72
+ plot_ball_with_points(ax, pts, facecolor='#6a98cb')
73
+
74
+ os.makedirs(os.path.dirname(save_path), exist_ok=True)
75
+ fig.tight_layout(pad=2)
76
+ fig.savefig(save_path, dpi=300)