sinabs 2.0.1.dev2__tar.gz → 2.0.1.dev3__tar.gz
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.
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/PKG-INFO +1 -1
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs.egg-info/PKG-INFO +1 -1
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs.egg-info/SOURCES.txt +2 -0
- sinabs-2.0.1.dev3/sinabs.egg-info/pbr.json +1 -0
- sinabs-2.0.1.dev3/tests/test_residual/NIR_graph_nonseq.ipynb +204 -0
- sinabs-2.0.1.dev3/tests/test_residual/test_jit_tracer_ann.ipynb +204 -0
- sinabs-2.0.1.dev3/tests/test_residual/test_jit_tracer_cnn.ipynb +149 -0
- sinabs-2.0.1.dev2/sinabs.egg-info/pbr.json +0 -1
- sinabs-2.0.1.dev2/tests/test_residual/NIR_graph_nonseq.ipynb +0 -210
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/.coveragerc +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/.github/workflows/ci-pipeline.yml +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/.pre-commit-config.yaml +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/.readthedocs.yaml +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/AUTHORS +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/CITATION.cff +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/ChangeLog +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/LICENSE +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/Pipfile +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/Pipfile.lock +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/README.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/codecov.yml +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/Makefile +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/Overview/dataflow_layers.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/Overview/event_preprocessing_pipeline.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/Overview/memory_constraints.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/Overview/sinabs-dynapcnn-role.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/Overview/speck_dynapcnn.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/Overview/speck_top_level.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/devkits_images/dynapcnn_devkit.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/devkits_images/speck_devkit.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/devkits_images/speck_module.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/devkits_images/speck_module_devkit.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/nmnist_quick_start/dvs_input_flow.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/nmnist_quick_start/dynapcnn_visualizer.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/nmnist_quick_start/spike_input_flow.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/power_monitoring/dynamic_power_samna_graph.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/power_monitoring/idle_power_samna_graph.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/power_monitoring/power_plot.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/sinabs-logo-lowercase-whitebg.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/sinabs-logo-lowercase.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/tips_for_training/exceeding_bandwidth.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/using_readout_layer/handcraft_weights.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/using_readout_layer/neuron_id_mismatch.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/using_readout_layer/readout_layer.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/using_readout_layer/samna_graph.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/visualize_speck_dvs/samna_graph.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/visualize_spike_count/samna_graph.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_static/visualize_spike_count/spike_count.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_templates/class_activation.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/_templates/class_layer.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/about/about.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/about/contributing.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/about/differences.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/about/info.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/about/release_notes.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/api/activation.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/api/api.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/api/from_torch.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/api/hooks.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/api/layers.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/api/network.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/api/nir.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/api/synopcounter.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/api/utils.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/conf.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/contact.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/README.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/layers/README.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/layers/plot_alif.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/layers/plot_exp_leaky.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/layers/plot_iaf.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/layers/plot_lif.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/layers/utils.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/spike_fns/README.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/spike_fns/plot_maxspike.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/spike_fns/plot_multispike.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/spike_fns/plot_singlespike.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/surrogate_grad_fns/README.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/surrogate_grad_fns/plot_gaussian.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/surrogate_grad_fns/plot_heaviside.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/surrogate_grad_fns/plot_multigaussian.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/surrogate_grad_fns/plot_periodicexponential.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/gallery/surrogate_grad_fns/plot_singleexponential.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/getting_started/fundamentals.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/getting_started/getting_started.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/getting_started/iaf_neuron_model.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/getting_started/install.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/getting_started/python_pyenv_pipenv.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/getting_started/quickstart.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/how_tos/activations.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/how_tos/custom_hooks.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/how_tos/how_tos.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/how_tos/synops_loss_ann.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/how_tos/synops_loss_snn.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/index.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/make.bat +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/plugins/plugins.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/requirements.txt +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/advanced_concepts.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/chip_factory.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/config_builder.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/crop2d.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/discretize.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/dvs_layer.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/dynapcnn.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/dynapcnn_layer.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/dynapcnn_network.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/dynapcnn_visualizer.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/exceptions.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/flipdims.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/io.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/mapping.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/specksim.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/api/dynapcnn/utils.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/dangers.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/faqs/add_new_device.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/faqs/available_algorithmic_operation.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/faqs/available_network_arch.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/faqs/chip_errata.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/faqs/device_management.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/faqs/index.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/faqs/output_monitoring.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/faqs/save_hardware_config_as_binary.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/faqs/tips_for_training.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/index.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/notebooks/leak_neuron.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/notebooks/nmnist_quick_start.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/notebooks/play_with_speck_dvs.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/notebooks/power_monitoring.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/notebooks/using_readout_layer.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/notebooks/visualize_speck_dvs_input.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/notebooks/visualize_spike_count.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/overview.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/specksim.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/the_basics.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/tutorials.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/speck/visualizer.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/tutorials/LeNet_5_EngChinese.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/tutorials/bptt.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/tutorials/nir_to_speck.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/tutorials/nmnist.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/tutorials/scnn_mnist.nir +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/tutorials/tutorials.rst +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/tutorials/weight_scaling.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/docs/tutorials/weight_transfer_mnist.ipynb +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/mnist/dynapcnn_network.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/mnist/mnist_params.pt +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/mnist/specksim_network.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/dvs_gesture_params.pt +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/gesture_viz.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/icons/01_armroll.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/icons/02_handclap.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/icons/03_lefthandclockwise.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/icons/04_lefthandcounterclockwise.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/icons/05_lefthandwave.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/icons/06_righthandwave.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/icons/07_righthandclockwise.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/icons/08_righthandcounterclockwise.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/icons/09_airdrums.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/icons/10_airguitar.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/examples/visualizer/icons/11_other.png +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/jupyterlab-requirements.txt +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/pull_request_template.md +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/requirements.txt +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/setup.cfg +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/setup.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/__init__.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/activation/__init__.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/activation/quantize.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/activation/reset_mechanism.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/activation/spike_generation.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/activation/surrogate_gradient_fn.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/__init__.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/__init__.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/chip_factory.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/chips/__init__.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/chips/dynapcnn.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/chips/speck2.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/chips/speck2b.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/chips/speck2cmini.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/chips/speck2dmini.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/chips/speck2e.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/chips/speck2f.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/config_builder.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/crop2d.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/discretize.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/dvs_layer.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/dynapcnn_layer.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/dynapcnn_network.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/dynapcnn_visualizer.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/exceptions.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/flipdims.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/io.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/mapping.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/specksim.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/backend/dynapcnn/utils.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/cnnutils.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/conversion.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/from_torch.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/hooks.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/__init__.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/alif.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/channel_shift.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/crop2d.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/exp_leak.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/functional/__init__.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/functional/alif.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/functional/lif.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/iaf.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/lif.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/merge.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/neuromorphic_relu.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/pool2d.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/quantize.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/reshape.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/stateful_layer.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/layers/to_spike.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/network.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/nir.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/synopcounter.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs/utils.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs.egg-info/dependency_links.txt +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs.egg-info/not-zip-safe +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs.egg-info/requires.txt +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/sinabs.egg-info/top_level.txt +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/inputs_and_results/hooks/conv_input.pth +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/inputs_and_results/hooks/conv_layer_synops.pth +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/inputs_and_results/hooks/firing_rates.pth +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/inputs_and_results/hooks/firing_rates_per_neuron.pth +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/inputs_and_results/hooks/input_diffs.pth +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/inputs_and_results/hooks/model_synops.pth +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/mnist_params.pt +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/models/README.txt +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/models/synop_hook_model.pth +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/requirements.txt +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_activations.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_batch_mismatch.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_batch_size_update.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_conversion.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_copy.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/hw_utils.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_auto_mapping.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_compatible_layer_build.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_config_making.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_device_movement.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_device_name_mapping.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_discover_device.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_discretized.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_doorbell.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_dvs_input.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_dvs_layer.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_event_conversion.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_individual_cases.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_large_net.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_learning.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_monitoring.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_neuron_leak.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_single_neuron_hardware.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_speck2e.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_speckmini_config_making.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_dynapcnn/test_visualizer.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_from_model.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_hooks.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_alif.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_channelshift.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_crop2d.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_exp_leak.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_iaf.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_img2spk.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_lif.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_maxpooling.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_merge.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_neuromorphic_relu.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_reshaping.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_sig2spk.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_layers/test_stateful_layer.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_network_class.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_nir.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_normalize_weights.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_onnx.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_quantize.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_specksim/test_specksim_bindings.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_specksim/test_specksim_conversion.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_specksim/test_specksim_network.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_surrogate_gradients.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_synops_counter.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/test_utils.py +0 -0
- {sinabs-2.0.1.dev2 → sinabs-2.0.1.dev3}/tests/weights/README.txt +0 -0
|
@@ -277,6 +277,8 @@ tests/test_layers/test_reshaping.py
|
|
|
277
277
|
tests/test_layers/test_sig2spk.py
|
|
278
278
|
tests/test_layers/test_stateful_layer.py
|
|
279
279
|
tests/test_residual/NIR_graph_nonseq.ipynb
|
|
280
|
+
tests/test_residual/test_jit_tracer_ann.ipynb
|
|
281
|
+
tests/test_residual/test_jit_tracer_cnn.ipynb
|
|
280
282
|
tests/test_specksim/test_specksim_bindings.py
|
|
281
283
|
tests/test_specksim/test_specksim_conversion.py
|
|
282
284
|
tests/test_specksim/test_specksim_network.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"git_version": "276eda3", "is_release": false}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "code",
|
|
5
|
+
"execution_count": 1,
|
|
6
|
+
"metadata": {},
|
|
7
|
+
"outputs": [],
|
|
8
|
+
"source": [
|
|
9
|
+
"import torch\n",
|
|
10
|
+
"import torch.nn as nn\n",
|
|
11
|
+
"from sinabs import to_nir\n",
|
|
12
|
+
"import networkx as nx\n",
|
|
13
|
+
"import matplotlib.pyplot as plt"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"cell_type": "code",
|
|
18
|
+
"execution_count": 2,
|
|
19
|
+
"metadata": {},
|
|
20
|
+
"outputs": [],
|
|
21
|
+
"source": [
|
|
22
|
+
"class NonSeq(nn.Module):\n",
|
|
23
|
+
" def __init__(self, *args, **kwargs) -> None:\n",
|
|
24
|
+
" super().__init__(*args, **kwargs)\n",
|
|
25
|
+
" # input tensor / output tensor\n",
|
|
26
|
+
" self.fc1 = nn.Linear(100, 50) # Size([1, 100]) / Size([1, 50])\n",
|
|
27
|
+
" self.fc2 = nn.Linear(50, 50) # Size([1, 50]) / Size([1, 50])\n",
|
|
28
|
+
" self.fc3 = nn.Linear(50, 50) # Size([1, 50]) / Size([1, 50])\n",
|
|
29
|
+
" self.fc4 = nn.Linear(50, 30) # Size([1, 50]) / Size([1, 30])\n",
|
|
30
|
+
" self.fc5 = nn.Linear(30, 2) # Size([1, 30]) / Size([1, 2])\n",
|
|
31
|
+
"\n",
|
|
32
|
+
" def forward(self, x):\n",
|
|
33
|
+
"\n",
|
|
34
|
+
" out1 = self.fc1(x)\n",
|
|
35
|
+
" out2 = self.fc2(out1)\n",
|
|
36
|
+
" out3 = self.fc3(out2)\n",
|
|
37
|
+
" out4 = self.fc4(out3 + out2)\n",
|
|
38
|
+
" out5 = self.fc5(out4)\n",
|
|
39
|
+
"\n",
|
|
40
|
+
" return out5\n",
|
|
41
|
+
"\n",
|
|
42
|
+
"ann = NonSeq()\n"
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"cell_type": "code",
|
|
47
|
+
"execution_count": 3,
|
|
48
|
+
"metadata": {},
|
|
49
|
+
"outputs": [
|
|
50
|
+
{
|
|
51
|
+
"name": "stdout",
|
|
52
|
+
"output_type": "stream",
|
|
53
|
+
"text": [
|
|
54
|
+
"7\n"
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"source": [
|
|
59
|
+
"ann_graph = [\n",
|
|
60
|
+
" ('input', 'fc1'),\n",
|
|
61
|
+
" ('fc1', 'fc2'),\n",
|
|
62
|
+
" ('fc2', 'fc3'),\n",
|
|
63
|
+
" ('fc2', 'fc4'),\n",
|
|
64
|
+
" ('fc3', 'fc4'),\n",
|
|
65
|
+
" ('fc4', 'fc5'),\n",
|
|
66
|
+
" ('fc5', 'output'),\n",
|
|
67
|
+
"]\n",
|
|
68
|
+
"\n",
|
|
69
|
+
"print(len(ann_graph))"
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"cell_type": "code",
|
|
74
|
+
"execution_count": 4,
|
|
75
|
+
"metadata": {},
|
|
76
|
+
"outputs": [],
|
|
77
|
+
"source": [
|
|
78
|
+
"# g_ideal = nx.DiGraph(ann_graph)\n",
|
|
79
|
+
"# nx.draw(g_ideal, with_labels = True)\n",
|
|
80
|
+
"# plt.show()"
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"cell_type": "code",
|
|
85
|
+
"execution_count": 5,
|
|
86
|
+
"metadata": {},
|
|
87
|
+
"outputs": [
|
|
88
|
+
{
|
|
89
|
+
"name": "stdout",
|
|
90
|
+
"output_type": "stream",
|
|
91
|
+
"text": [
|
|
92
|
+
"=================================\n",
|
|
93
|
+
"> input_data: torch.Size([1, 100])\n",
|
|
94
|
+
" creating Node: Tensor_0(1, 100) <inp>\n",
|
|
95
|
+
" returning Node: fc1 <inp>\n",
|
|
96
|
+
"> output_data: torch.Size([1, 50])\n",
|
|
97
|
+
" returning Node: fc1 <out>\n",
|
|
98
|
+
" creating Node: Tensor_1(1, 50) <out>\n",
|
|
99
|
+
"\n",
|
|
100
|
+
"\n",
|
|
101
|
+
"> input_data: torch.Size([1, 50])\n",
|
|
102
|
+
" returning Node: Tensor_1(1, 50) <inp>\n",
|
|
103
|
+
" returning Node: fc2 <inp>\n",
|
|
104
|
+
"> output_data: torch.Size([1, 50])\n",
|
|
105
|
+
" returning Node: fc2 <out>\n",
|
|
106
|
+
" creating Node: Tensor_2(1, 50) <out>\n",
|
|
107
|
+
"\n",
|
|
108
|
+
"\n",
|
|
109
|
+
"> input_data: torch.Size([1, 50])\n",
|
|
110
|
+
" returning Node: Tensor_2(1, 50) <inp>\n",
|
|
111
|
+
" returning Node: fc3 <inp>\n",
|
|
112
|
+
"> output_data: torch.Size([1, 50])\n",
|
|
113
|
+
" returning Node: fc3 <out>\n",
|
|
114
|
+
" creating Node: Tensor_3(1, 50) <out>\n",
|
|
115
|
+
"\n",
|
|
116
|
+
"\n",
|
|
117
|
+
"> input_data: torch.Size([1, 50])\n",
|
|
118
|
+
" creating Node: Tensor_4(1, 50) <inp>\n",
|
|
119
|
+
" returning Node: fc4 <inp>\n",
|
|
120
|
+
"> output_data: torch.Size([1, 30])\n",
|
|
121
|
+
" returning Node: fc4 <out>\n",
|
|
122
|
+
" creating Node: Tensor_5(1, 30) <out>\n",
|
|
123
|
+
"\n",
|
|
124
|
+
"\n",
|
|
125
|
+
"> input_data: torch.Size([1, 30])\n",
|
|
126
|
+
" returning Node: Tensor_5(1, 30) <inp>\n",
|
|
127
|
+
" returning Node: fc5 <inp>\n",
|
|
128
|
+
"> output_data: torch.Size([1, 2])\n",
|
|
129
|
+
" returning Node: fc5 <out>\n",
|
|
130
|
+
" creating Node: Tensor_6(1, 2) <out>\n",
|
|
131
|
+
"\n",
|
|
132
|
+
"\n",
|
|
133
|
+
"> input_data: torch.Size([1, 100])\n",
|
|
134
|
+
"> output_data: torch.Size([1, 2])\n",
|
|
135
|
+
"\n",
|
|
136
|
+
"\n",
|
|
137
|
+
"++++++++++++++++++++++++++++++++\n",
|
|
138
|
+
" returning Node: fc1 \n",
|
|
139
|
+
" returning Node: fc2 \n",
|
|
140
|
+
" returning Node: fc2 \n",
|
|
141
|
+
" returning Node: fc3 \n",
|
|
142
|
+
" returning Node: fc4 \n",
|
|
143
|
+
" returning Node: fc5 \n",
|
|
144
|
+
"-------------extract_nir_graph_v2(extract_torch_graph()) (wrong)---------------\n",
|
|
145
|
+
">>>> fc1\n",
|
|
146
|
+
">>>> fc2\n",
|
|
147
|
+
">>>> fc3\n",
|
|
148
|
+
">>>> fc4\n",
|
|
149
|
+
">>>> fc5\n",
|
|
150
|
+
"```mermaid\n",
|
|
151
|
+
"graph TD;\n",
|
|
152
|
+
"fc1 --> fc2;\n",
|
|
153
|
+
"fc2 --> fc3;\n",
|
|
154
|
+
"fc3;\n",
|
|
155
|
+
"fc4 --> fc5;\n",
|
|
156
|
+
"fc5;\n",
|
|
157
|
+
"\n",
|
|
158
|
+
"```\n",
|
|
159
|
+
" <class 'nirtorch.graph.Graph'>\n",
|
|
160
|
+
"--------------------------------------------------------\n",
|
|
161
|
+
"0: 1\n",
|
|
162
|
+
"1: 6 [('input', 'fc1'), ('fc1', 'fc2'), ('fc2', 'fc3'), ('fc3', 'output'), ('fc4', 'fc5'), ('fc5', 'output')]\n",
|
|
163
|
+
"2: 6\n"
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
],
|
|
167
|
+
"source": [
|
|
168
|
+
"nir_graph = to_nir(ann, torch.randn(1, 100))"
|
|
169
|
+
]
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"cell_type": "code",
|
|
173
|
+
"execution_count": 6,
|
|
174
|
+
"metadata": {},
|
|
175
|
+
"outputs": [],
|
|
176
|
+
"source": [
|
|
177
|
+
"# g_nir = nx.DiGraph(nir_graph.edges)\n",
|
|
178
|
+
"# nx.draw(g_nir, with_labels = True)\n",
|
|
179
|
+
"# plt.show()"
|
|
180
|
+
]
|
|
181
|
+
}
|
|
182
|
+
],
|
|
183
|
+
"metadata": {
|
|
184
|
+
"kernelspec": {
|
|
185
|
+
"display_name": "speck-rescnn",
|
|
186
|
+
"language": "python",
|
|
187
|
+
"name": "python3"
|
|
188
|
+
},
|
|
189
|
+
"language_info": {
|
|
190
|
+
"codemirror_mode": {
|
|
191
|
+
"name": "ipython",
|
|
192
|
+
"version": 3
|
|
193
|
+
},
|
|
194
|
+
"file_extension": ".py",
|
|
195
|
+
"mimetype": "text/x-python",
|
|
196
|
+
"name": "python",
|
|
197
|
+
"nbconvert_exporter": "python",
|
|
198
|
+
"pygments_lexer": "ipython3",
|
|
199
|
+
"version": "3.11.3"
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
"nbformat": 4,
|
|
203
|
+
"nbformat_minor": 2
|
|
204
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "code",
|
|
5
|
+
"execution_count": 10,
|
|
6
|
+
"metadata": {},
|
|
7
|
+
"outputs": [],
|
|
8
|
+
"source": [
|
|
9
|
+
"import torch\n",
|
|
10
|
+
"import torch.nn as nn"
|
|
11
|
+
]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"cell_type": "code",
|
|
15
|
+
"execution_count": 11,
|
|
16
|
+
"metadata": {},
|
|
17
|
+
"outputs": [],
|
|
18
|
+
"source": [
|
|
19
|
+
"class NonSeq(nn.Module):\n",
|
|
20
|
+
" def __init__(self, *args, **kwargs) -> None:\n",
|
|
21
|
+
" super().__init__(*args, **kwargs)\n",
|
|
22
|
+
" self.fc1 = nn.Linear(100, 50)\n",
|
|
23
|
+
" self.fc2 = nn.Linear(50, 50)\n",
|
|
24
|
+
" self.fc3 = nn.Linear(50, 50)\n",
|
|
25
|
+
" self.fc4 = nn.Linear(50, 30)\n",
|
|
26
|
+
" self.fc5 = nn.Linear(30, 2)\n",
|
|
27
|
+
"\n",
|
|
28
|
+
" def forward(self, x):\n",
|
|
29
|
+
" out1 = self.fc1(x)\n",
|
|
30
|
+
" out2 = self.fc2(out1)\n",
|
|
31
|
+
" out3 = self.fc3(out2)\n",
|
|
32
|
+
" out4 = self.fc4(out3 + out2)\n",
|
|
33
|
+
" out5 = self.fc5(out4)\n",
|
|
34
|
+
" return out5\n",
|
|
35
|
+
"\n",
|
|
36
|
+
"model = NonSeq()"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"cell_type": "code",
|
|
41
|
+
"execution_count": 12,
|
|
42
|
+
"metadata": {},
|
|
43
|
+
"outputs": [],
|
|
44
|
+
"source": [
|
|
45
|
+
"dummy_input = torch.randn(1, 100)"
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"cell_type": "code",
|
|
50
|
+
"execution_count": 13,
|
|
51
|
+
"metadata": {},
|
|
52
|
+
"outputs": [],
|
|
53
|
+
"source": [
|
|
54
|
+
"trace = torch.jit.trace(model, dummy_input)"
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"cell_type": "code",
|
|
59
|
+
"execution_count": 14,
|
|
60
|
+
"metadata": {},
|
|
61
|
+
"outputs": [],
|
|
62
|
+
"source": [
|
|
63
|
+
"trace_output = trace(dummy_input)"
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"cell_type": "code",
|
|
68
|
+
"execution_count": 15,
|
|
69
|
+
"metadata": {},
|
|
70
|
+
"outputs": [
|
|
71
|
+
{
|
|
72
|
+
"name": "stdout",
|
|
73
|
+
"output_type": "stream",
|
|
74
|
+
"text": [
|
|
75
|
+
"graph(%self.1 : __torch__.___torch_mangle_15.NonSeq,\n",
|
|
76
|
+
" %x : Float(1, 100, strides=[100, 1], requires_grad=0, device=cpu)):\n",
|
|
77
|
+
" %fc5 : __torch__.torch.nn.modules.linear.___torch_mangle_14.Linear = prim::GetAttr[name=\"fc5\"](%self.1)\n",
|
|
78
|
+
" %fc4 : __torch__.torch.nn.modules.linear.___torch_mangle_13.Linear = prim::GetAttr[name=\"fc4\"](%self.1)\n",
|
|
79
|
+
" %fc3 : __torch__.torch.nn.modules.linear.___torch_mangle_12.Linear = prim::GetAttr[name=\"fc3\"](%self.1)\n",
|
|
80
|
+
" %fc2 : __torch__.torch.nn.modules.linear.___torch_mangle_11.Linear = prim::GetAttr[name=\"fc2\"](%self.1)\n",
|
|
81
|
+
" %fc1 : __torch__.torch.nn.modules.linear.___torch_mangle_10.Linear = prim::GetAttr[name=\"fc1\"](%self.1)\n",
|
|
82
|
+
" %61 : Tensor = prim::CallMethod[name=\"forward\"](%fc1, %x)\n",
|
|
83
|
+
" %62 : Tensor = prim::CallMethod[name=\"forward\"](%fc2, %61)\n",
|
|
84
|
+
" %63 : Tensor = prim::CallMethod[name=\"forward\"](%fc3, %62)\n",
|
|
85
|
+
" %32 : int = prim::Constant[value=1]() # /tmp/ipykernel_16069/242438593.py:14:0\n",
|
|
86
|
+
" %input.5 : Float(1, 50, strides=[50, 1], requires_grad=1, device=cpu) = aten::add(%63, %62, %32) # /tmp/ipykernel_16069/242438593.py:14:0\n",
|
|
87
|
+
" %64 : Tensor = prim::CallMethod[name=\"forward\"](%fc4, %input.5)\n",
|
|
88
|
+
" %65 : Tensor = prim::CallMethod[name=\"forward\"](%fc5, %64)\n",
|
|
89
|
+
" return (%65)\n",
|
|
90
|
+
"\n"
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
"source": [
|
|
95
|
+
"print(trace.graph)"
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"cell_type": "code",
|
|
100
|
+
"execution_count": 16,
|
|
101
|
+
"metadata": {},
|
|
102
|
+
"outputs": [
|
|
103
|
+
{
|
|
104
|
+
"name": "stdout",
|
|
105
|
+
"output_type": "stream",
|
|
106
|
+
"text": [
|
|
107
|
+
"def forward(self,\n",
|
|
108
|
+
" x: Tensor) -> Tensor:\n",
|
|
109
|
+
" fc5 = self.fc5\n",
|
|
110
|
+
" fc4 = self.fc4\n",
|
|
111
|
+
" fc3 = self.fc3\n",
|
|
112
|
+
" fc2 = self.fc2\n",
|
|
113
|
+
" fc1 = self.fc1\n",
|
|
114
|
+
" _0 = (fc2).forward((fc1).forward(x, ), )\n",
|
|
115
|
+
" input = torch.add((fc3).forward(_0, ), _0)\n",
|
|
116
|
+
" _1 = (fc5).forward((fc4).forward(input, ), )\n",
|
|
117
|
+
" return _1\n",
|
|
118
|
+
" <class 'str'>\n"
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
],
|
|
122
|
+
"source": [
|
|
123
|
+
"print(trace.code, type(trace.code))"
|
|
124
|
+
]
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"cell_type": "code",
|
|
128
|
+
"execution_count": 19,
|
|
129
|
+
"metadata": {},
|
|
130
|
+
"outputs": [
|
|
131
|
+
{
|
|
132
|
+
"name": "stdout",
|
|
133
|
+
"output_type": "stream",
|
|
134
|
+
"text": [
|
|
135
|
+
"(%fc5 : __torch__.torch.nn.modules.linear.___torch_mangle_14.Linear = prim::GetAttr[name=\"fc5\"](%self.1)\n",
|
|
136
|
+
", fc5 defined in (%fc5 : __torch__.torch.nn.modules.linear.___torch_mangle_14.Linear = prim::GetAttr[name=\"fc5\"](%self.1)\n",
|
|
137
|
+
"))\n",
|
|
138
|
+
"(%fc4 : __torch__.torch.nn.modules.linear.___torch_mangle_13.Linear = prim::GetAttr[name=\"fc4\"](%self.1)\n",
|
|
139
|
+
", fc4 defined in (%fc4 : __torch__.torch.nn.modules.linear.___torch_mangle_13.Linear = prim::GetAttr[name=\"fc4\"](%self.1)\n",
|
|
140
|
+
"))\n",
|
|
141
|
+
"(%fc3 : __torch__.torch.nn.modules.linear.___torch_mangle_12.Linear = prim::GetAttr[name=\"fc3\"](%self.1)\n",
|
|
142
|
+
", fc3 defined in (%fc3 : __torch__.torch.nn.modules.linear.___torch_mangle_12.Linear = prim::GetAttr[name=\"fc3\"](%self.1)\n",
|
|
143
|
+
"))\n",
|
|
144
|
+
"(%fc2 : __torch__.torch.nn.modules.linear.___torch_mangle_11.Linear = prim::GetAttr[name=\"fc2\"](%self.1)\n",
|
|
145
|
+
", fc2 defined in (%fc2 : __torch__.torch.nn.modules.linear.___torch_mangle_11.Linear = prim::GetAttr[name=\"fc2\"](%self.1)\n",
|
|
146
|
+
"))\n",
|
|
147
|
+
"(%fc1 : __torch__.torch.nn.modules.linear.___torch_mangle_10.Linear = prim::GetAttr[name=\"fc1\"](%self.1)\n",
|
|
148
|
+
", fc1 defined in (%fc1 : __torch__.torch.nn.modules.linear.___torch_mangle_10.Linear = prim::GetAttr[name=\"fc1\"](%self.1)\n",
|
|
149
|
+
"))\n",
|
|
150
|
+
"(%61 : Tensor = prim::CallMethod[name=\"forward\"](%fc1, %x)\n",
|
|
151
|
+
", 61 defined in (%61 : Tensor = prim::CallMethod[name=\"forward\"](%fc1, %x)\n",
|
|
152
|
+
"))\n",
|
|
153
|
+
"(%62 : Tensor = prim::CallMethod[name=\"forward\"](%fc2, %61)\n",
|
|
154
|
+
", 62 defined in (%62 : Tensor = prim::CallMethod[name=\"forward\"](%fc2, %61)\n",
|
|
155
|
+
"))\n",
|
|
156
|
+
"(%63 : Tensor = prim::CallMethod[name=\"forward\"](%fc3, %62)\n",
|
|
157
|
+
", 63 defined in (%63 : Tensor = prim::CallMethod[name=\"forward\"](%fc3, %62)\n",
|
|
158
|
+
"))\n",
|
|
159
|
+
"(%32 : int = prim::Constant[value=1]() # /tmp/ipykernel_16069/242438593.py:14:0\n",
|
|
160
|
+
", 32 defined in (%32 : int = prim::Constant[value=1]() # /tmp/ipykernel_16069/242438593.py:14:0\n",
|
|
161
|
+
"))\n",
|
|
162
|
+
"(%input.5 : Float(1, 50, strides=[50, 1], requires_grad=1, device=cpu) = aten::add(%63, %62, %32) # /tmp/ipykernel_16069/242438593.py:14:0\n",
|
|
163
|
+
", input.5 defined in (%input.5 : Float(1, 50, strides=[50, 1], requires_grad=1, device=cpu) = aten::add(%63, %62, %32) # /tmp/ipykernel_16069/242438593.py:14:0\n",
|
|
164
|
+
"))\n",
|
|
165
|
+
"(%64 : Tensor = prim::CallMethod[name=\"forward\"](%fc4, %input.5)\n",
|
|
166
|
+
", 64 defined in (%64 : Tensor = prim::CallMethod[name=\"forward\"](%fc4, %input.5)\n",
|
|
167
|
+
"))\n",
|
|
168
|
+
"(%65 : Tensor = prim::CallMethod[name=\"forward\"](%fc5, %64)\n",
|
|
169
|
+
", 65 defined in (%65 : Tensor = prim::CallMethod[name=\"forward\"](%fc5, %64)\n",
|
|
170
|
+
"))\n"
|
|
171
|
+
]
|
|
172
|
+
}
|
|
173
|
+
],
|
|
174
|
+
"source": [
|
|
175
|
+
"edges = []\n",
|
|
176
|
+
"for node in trace.graph.nodes():\n",
|
|
177
|
+
" for next_node in node.outputs():\n",
|
|
178
|
+
" edges.append((node, next_node))\n",
|
|
179
|
+
" print(edges[-1])"
|
|
180
|
+
]
|
|
181
|
+
}
|
|
182
|
+
],
|
|
183
|
+
"metadata": {
|
|
184
|
+
"kernelspec": {
|
|
185
|
+
"display_name": "speck-rescnn",
|
|
186
|
+
"language": "python",
|
|
187
|
+
"name": "python3"
|
|
188
|
+
},
|
|
189
|
+
"language_info": {
|
|
190
|
+
"codemirror_mode": {
|
|
191
|
+
"name": "ipython",
|
|
192
|
+
"version": 3
|
|
193
|
+
},
|
|
194
|
+
"file_extension": ".py",
|
|
195
|
+
"mimetype": "text/x-python",
|
|
196
|
+
"name": "python",
|
|
197
|
+
"nbconvert_exporter": "python",
|
|
198
|
+
"pygments_lexer": "ipython3",
|
|
199
|
+
"version": "3.11.3"
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
"nbformat": 4,
|
|
203
|
+
"nbformat_minor": 2
|
|
204
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "code",
|
|
5
|
+
"execution_count": 9,
|
|
6
|
+
"metadata": {},
|
|
7
|
+
"outputs": [],
|
|
8
|
+
"source": [
|
|
9
|
+
"import torch\n",
|
|
10
|
+
"import torch.nn as nn"
|
|
11
|
+
]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"cell_type": "code",
|
|
15
|
+
"execution_count": 10,
|
|
16
|
+
"metadata": {},
|
|
17
|
+
"outputs": [],
|
|
18
|
+
"source": [
|
|
19
|
+
"class NonSeqCNN(nn.Module):\n",
|
|
20
|
+
" def __init__(self) -> None:\n",
|
|
21
|
+
" super().__init__()\n",
|
|
22
|
+
" self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)\n",
|
|
23
|
+
" self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)\n",
|
|
24
|
+
" self.conv3 = nn.Conv2d(64, 64, kernel_size=3, padding=1)\n",
|
|
25
|
+
" self.conv4 = nn.Conv2d(64, 128, kernel_size=3, padding=1)\n",
|
|
26
|
+
" self.conv5 = nn.Conv2d(128, 128, kernel_size=3, padding=1)\n",
|
|
27
|
+
"\n",
|
|
28
|
+
" def forward(self, x):\n",
|
|
29
|
+
" out1 = torch.relu(self.conv1(x))\n",
|
|
30
|
+
" out2 = torch.relu(self.conv2(out1))\n",
|
|
31
|
+
" out3 = torch.relu(self.conv3(out2))\n",
|
|
32
|
+
" out4 = torch.relu(self.conv4(out3))\n",
|
|
33
|
+
" # Apply a 1x1 convolution to match dimensions for the skip connection\n",
|
|
34
|
+
" out2_skip = torch.relu(nn.Conv2d(64, 128, kernel_size=1)(out2))\n",
|
|
35
|
+
" # Introduce skip connection by adding outputs of conv2 and conv3\n",
|
|
36
|
+
" out4_skip = out4 + out2_skip\n",
|
|
37
|
+
" out5 = torch.relu(self.conv5(out4_skip))\n",
|
|
38
|
+
" return out5\n",
|
|
39
|
+
"\n",
|
|
40
|
+
"model = NonSeqCNN()"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"cell_type": "code",
|
|
45
|
+
"execution_count": 11,
|
|
46
|
+
"metadata": {},
|
|
47
|
+
"outputs": [],
|
|
48
|
+
"source": [
|
|
49
|
+
"dummy_input = torch.randn(1, 3, 32, 32)"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"cell_type": "code",
|
|
54
|
+
"execution_count": 12,
|
|
55
|
+
"metadata": {},
|
|
56
|
+
"outputs": [
|
|
57
|
+
{
|
|
58
|
+
"name": "stderr",
|
|
59
|
+
"output_type": "stream",
|
|
60
|
+
"text": [
|
|
61
|
+
"/home/willian/.local/lib/python3.11/site-packages/torch/jit/_trace.py:1102: TracerWarning: Trace had nondeterministic nodes. Did you forget call .eval() on your model? Nodes:\n",
|
|
62
|
+
"\t%tensor.3 : Float(128, 64, 1, 1, strides=[64, 1, 1, 1], requires_grad=1, device=cpu) = aten::uniform_(%tensor.1, %173, %174, %175) # /home/willian/.local/lib/python3.11/site-packages/torch/nn/init.py:459:0\n",
|
|
63
|
+
"\t%bias.9 : Float(128, strides=[1], requires_grad=1, device=cpu) = aten::uniform_(%tensor, %202, %203, %204) # /home/willian/.local/lib/python3.11/site-packages/torch/nn/init.py:15:0\n",
|
|
64
|
+
"This may cause errors in trace checking. To disable trace checking, pass check_trace=False to torch.jit.trace()\n",
|
|
65
|
+
" _check_trace(\n",
|
|
66
|
+
"/home/willian/.local/lib/python3.11/site-packages/torch/jit/_trace.py:1102: TracerWarning: Output nr 1. of the traced function does not match the corresponding output of the Python function. Detailed error:\n",
|
|
67
|
+
"Tensor-likes are not close!\n",
|
|
68
|
+
"\n",
|
|
69
|
+
"Mismatched elements: 87964 / 131072 (67.1%)\n",
|
|
70
|
+
"Greatest absolute difference: 0.22646202147006989 at index (0, 69, 20, 16) (up to 1e-05 allowed)\n",
|
|
71
|
+
"Greatest relative difference: inf at index (0, 1, 0, 1) (up to 1e-05 allowed)\n",
|
|
72
|
+
" _check_trace(\n"
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"source": [
|
|
77
|
+
"trace = torch.jit.trace(model, dummy_input)"
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"cell_type": "code",
|
|
82
|
+
"execution_count": 13,
|
|
83
|
+
"metadata": {},
|
|
84
|
+
"outputs": [],
|
|
85
|
+
"source": [
|
|
86
|
+
"trace_output = trace(dummy_input)"
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"cell_type": "code",
|
|
91
|
+
"execution_count": 15,
|
|
92
|
+
"metadata": {},
|
|
93
|
+
"outputs": [
|
|
94
|
+
{
|
|
95
|
+
"name": "stdout",
|
|
96
|
+
"output_type": "stream",
|
|
97
|
+
"text": [
|
|
98
|
+
"def forward(self,\n",
|
|
99
|
+
" x: Tensor) -> Tensor:\n",
|
|
100
|
+
" conv5 = self.conv5\n",
|
|
101
|
+
" conv4 = self.conv4\n",
|
|
102
|
+
" conv3 = self.conv3\n",
|
|
103
|
+
" conv2 = self.conv2\n",
|
|
104
|
+
" conv1 = self.conv1\n",
|
|
105
|
+
" input = torch.relu((conv1).forward(x, ))\n",
|
|
106
|
+
" input0 = torch.relu((conv2).forward(input, ))\n",
|
|
107
|
+
" input1 = torch.relu((conv3).forward(input0, ))\n",
|
|
108
|
+
" out4 = torch.relu((conv4).forward(input1, ))\n",
|
|
109
|
+
" data = torch.empty([128, 64, 1, 1], dtype=None, layout=None, device=torch.device(\"cpu\"), pin_memory=False)\n",
|
|
110
|
+
" tensor = torch.detach(data)\n",
|
|
111
|
+
" data0 = torch.empty([128], dtype=None, layout=None, device=torch.device(\"cpu\"), pin_memory=False)\n",
|
|
112
|
+
" tensor0 = torch.detach(data0)\n",
|
|
113
|
+
" tensor1 = torch.uniform_(tensor, -0.12499999999999999, 0.12499999999999999)\n",
|
|
114
|
+
" bias = torch.uniform_(tensor0, -0.125, 0.125)\n",
|
|
115
|
+
" _0 = torch._convolution(input0, tensor1, bias, [1, 1], [0, 0], [1, 1], False, [0, 0], 1, False, False, True, True)\n",
|
|
116
|
+
" out2_skip = torch.relu(_0)\n",
|
|
117
|
+
" input2 = torch.add(out4, out2_skip)\n",
|
|
118
|
+
" return torch.relu((conv5).forward(input2, ))\n",
|
|
119
|
+
" <class 'str'>\n"
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
],
|
|
123
|
+
"source": [
|
|
124
|
+
"print(trace.code, type(trace.code))"
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
"metadata": {
|
|
129
|
+
"kernelspec": {
|
|
130
|
+
"display_name": "speck-rescnn",
|
|
131
|
+
"language": "python",
|
|
132
|
+
"name": "python3"
|
|
133
|
+
},
|
|
134
|
+
"language_info": {
|
|
135
|
+
"codemirror_mode": {
|
|
136
|
+
"name": "ipython",
|
|
137
|
+
"version": 3
|
|
138
|
+
},
|
|
139
|
+
"file_extension": ".py",
|
|
140
|
+
"mimetype": "text/x-python",
|
|
141
|
+
"name": "python",
|
|
142
|
+
"nbconvert_exporter": "python",
|
|
143
|
+
"pygments_lexer": "ipython3",
|
|
144
|
+
"version": "3.11.3"
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
"nbformat": 4,
|
|
148
|
+
"nbformat_minor": 2
|
|
149
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"git_version": "47d5c0b", "is_release": false}
|