CovertLab / wcEcoli

Whole Cell Model of E. coli
Other
18 stars 3 forks source link

Standard future feature imports #160

Open jmason42 opened 6 years ago

jmason42 commented 6 years ago

Lots of bugs are consequent of Python 2's default integer division behavior, which is changed in Python 3 to return a float (while the // operator handles the old behavior). For this reason I tried to add

from __future__ import division

to every file. I think we should enforce this, and further, we should consider adding other imports, like the new function-based print and forced absolute importing. This will reduce the likelihood of bugs and maximize compatibility with a potential switch to Python 3.

1fish2 commented 6 years ago

Agreed.

Q: How to find cases that need to change from / to //?

jmason42 commented 6 years ago

Most files already have the division import; I was really aggressive about this. Probably some sort of find command could locate all *.py files that lack the line. That hopefully leaves a handful of cases to inspect manually.

Just out of curiosity I took a look through the Process subclass files; equilibrium.py, tf_binding.py, and two_component_system.py are the only ones to lack the import, and in the few cases where they use the division operator on numbers, floating-point division is the intention. I think most other groups of code will be easy to fix (everything in the wholecell module, for example, has pretty clear intentions). The really scary chunk is the analysis scripts. For those I can imagine running via PyCharm would be extremely helpful, since we could inspect types and values, and then see where they are used. It's a shame analysis scripts aren't more standardized, but that sounds almost as difficult as building a GUI library.

jmason42 commented 5 years ago

We've begun implementing this piecemeal as well as two other imports, ala

from __future__ import absolute_import, division, print_function
1fish2 commented 5 years ago

While I won't be able to scan the code until Sunday (running from the Allen Foundation seminar), something like this should work:

grep -Rv 'import .* division'

There's an open issue about future division compatibility vs. the units code. That needs debugging.

1fish2 commented 5 years ago

A working command:

fd '^[^_].*py$' -I | xargs grep -L 'import.\+division'

finds 150 files that don't import division.

(The fd utility is an easier and faster utility than find. Here, I used a filename regex to ignore the __init__.py files. By default it skips .gitignored and hidden files, and apparently it alphabetizes the filenames better than find):

models/ecoli/analysis/cohort/centralCarbonMetabolismScatter.py
models/ecoli/analysis/cohort/doubling_times_histogram_all.py
models/ecoli/analysis/cohort/expression_dynamics.py
models/ecoli/analysis/cohort/growthDynamics.py
models/ecoli/analysis/cohort/initialVsFinalMass.py
models/ecoli/analysis/cohort/mass_fraction_instantaneous_growth_rates.py
models/ecoli/analysis/cohort/proteinFoldChangeVsTranscriptionFrequency.py
models/ecoli/analysis/cohort/transcriptFrequency.py
models/ecoli/analysis/cohort/transcriptionGenomeCoverage.py
models/ecoli/analysis/cohort/transcriptionGenomeCoverageSecondHalf.py
models/ecoli/analysis/multigen/cellCycleLength.py
models/ecoli/analysis/multigen/centralCarbonMetabolismScatter.py
models/ecoli/analysis/multigen/environmental_shift_fluxes.py
models/ecoli/analysis/multigen/functionalUnits.py
models/ecoli/analysis/multigen/functionalUnitsFC.py
models/ecoli/analysis/multigen/limitedEnzymeGlutcyslig.py
models/ecoli/analysis/multigen/limitedEnzymeUgd.py
models/ecoli/analysis/multigen/massFractionSummary.py
models/ecoli/analysis/multigen/massFractionToUnity.py
models/ecoli/analysis/multigen/massShift.py
models/ecoli/analysis/multigen/mene_limitations.py
models/ecoli/analysis/multigen/probProteinExistAndDouble.py
models/ecoli/analysis/multigen/proteinAvgCountVsBurstSize.py
models/ecoli/analysis/multigen/proteinCountVsFoldChange.py
models/ecoli/analysis/multigen/proteinExistVsBurstSize.py
models/ecoli/analysis/multigen/proteinFoldChangeVsRnaDeg.py
models/ecoli/analysis/multigen/proteinFoldChangeVsTranscriptionEvents.py
models/ecoli/analysis/multigen/proteinFoldChangeVsTranslationEff.py
models/ecoli/analysis/multigen/replication.py
models/ecoli/analysis/multigen/rnaVsProteinPerCell.py
models/ecoli/analysis/multigen/rna_decay_03_high.py
models/ecoli/analysis/multigen/subgenerationalTranscription.py
models/ecoli/analysis/multigen/transcriptionEvents.py
models/ecoli/analysis/multigen/transcriptionFrequency.py
models/ecoli/analysis/multigen/transcriptionFrequencyOrdered.py
models/ecoli/analysis/multigen/transcriptionGenomeCoverage.py
models/ecoli/analysis/multigen/translationFrequency.py
models/ecoli/analysis/single/aaCounts.py
models/ecoli/analysis/single/aaExchangeFluxes.py
models/ecoli/analysis/single/allReactionFluxes.py
models/ecoli/analysis/single/concentrationDeviation.py
models/ecoli/analysis/single/dntpCounts.py
models/ecoli/analysis/single/equilibriumComparison.py
models/ecoli/analysis/single/expression_rna_01_low.py
models/ecoli/analysis/single/expression_rna_02_med.py
models/ecoli/analysis/single/expression_rna_03_high.py
models/ecoli/analysis/single/glucoseAndOxygenExchangeFluxes.py
models/ecoli/analysis/single/massFractionSummary.py
models/ecoli/analysis/single/massFractions.py
models/ecoli/analysis/single/ntpCounts.py
models/ecoli/analysis/single/ribosome30SCounts.py
models/ecoli/analysis/single/ribosome50SCounts.py
models/ecoli/analysis/single/rnapCounts.py
models/ecoli/analysis/single/rnaseCounts.py
models/ecoli/analysis/single/twoComponentSystem.py
models/ecoli/analysis/variant/adder_sizer.py
models/ecoli/analysis/variant/doubling_time_histogram.py
models/ecoli/analysis/variant/growthConditionComparison.py
models/ecoli/analysis/variant/growth_condition_comparison_validation.py
models/ecoli/analysis/variant/massFractionSummary.py
models/ecoli/analysis/variant/meneSensitivity.py
models/ecoli/analysis/variant/tfFit.py
models/ecoli/analysis/variant/tfFitComparison.py
models/ecoli/analysis/variant/tfTarget.py
models/ecoli/processes/equilibrium.py
models/ecoli/processes/tf_binding.py
models/ecoli/sim/simulation.py
models/ecoli/sim/variants/all_shuffle_params.py
models/ecoli/sim/variants/catalyst_shuffle_params.py
models/ecoli/sim/variants/condition.py
models/ecoli/sim/variants/gene_knockout.py
models/ecoli/sim/variants/kinetic_catalyst_shuffle_params.py
models/ecoli/sim/variants/kinetic_target_shuffle_params.py
models/ecoli/sim/variants/mene_params.py
models/ecoli/sim/variants/metabolism_kinetic_objective_weight.py
models/ecoli/sim/variants/monomer_deg_rate_shuffle_params.py
models/ecoli/sim/variants/nutrient_time_series.py
models/ecoli/sim/variants/rna_deg_rate_shuffle_params.py
models/ecoli/sim/variants/tf_activity.py
models/ecoli/sim/variants/transcription_initiation_shuffle_params.py
models/ecoli/sim/variants/translation_efficiencies_shuffle_params.py
models/ecoli/sim/variants/wildtype.py
prototypes/metabolism/baserates_modularFBA_toy_model.py
prototypes/metabolism/homeostaticFBA_modularFBA_toy_model/homeostatic_FBA_modular_FBA_toy_model.py
prototypes/metabolism/modularHomeostaticFbaToyModel.py
prototypes/metabolism/moma_modularFBA_toy_model.py
prototypes/metabolism/normalized_moma_modularFBA_toy_model.py
prototypes/metabolism/test_model.py
prototypes/metabolism/unconstrained_modularFBA_toy_model.py
prototypes/metabolism/unconstrained_toy_model.py
reconstruction/ecoli/compendium/growth_data.py
reconstruction/ecoli/dataclasses/process/equilibrium.py
reconstruction/ecoli/dataclasses/process/equilibrium_odes.py
reconstruction/ecoli/dataclasses/process/two_component_system_odes.py
reconstruction/ecoli/dataclasses/process/two_component_system_odes_fitter.py
reconstruction/ecoli/dataclasses/state/stateFunctions.py
reconstruction/ecoli/flat/scripts/biomassMetaboliteMod.py
reconstruction/ecoli/flat/scripts/get_charged_masses.py
reconstruction/ecoli/flat/scripts/kb_to_flat.py
reconstruction/ecoli/flat/scripts/load_save_tsv.py
reconstruction/ecoli/flat/scripts/massfrac_flat.py
reconstruction/ecoli/flat/scripts/metweights2.py
reconstruction/ecoli/flat/scripts/other_weights.py
reconstruction/ecoli/flat/scripts/unifyBulkFiles.py
reconstruction/spreadsheets.py
runscripts/animations/chromosome_svg.py
runscripts/debug/summarize_environment.py
runscripts/fileManipulation/addNonPdfPlots.py
runscripts/fileManipulation/convertToVariantSimulation.py
runscripts/fileManipulation/deleteEmptySims.py
runscripts/fireworks/fw_queue.py
runscripts/fittingAnalysis/synthetaseTurnover.py
runscripts/manual/load_sim_data.py
runscripts/reconstruction/build_complexation_reactions.py
runscripts/reconstruction/reaction_enzymes.py
runscripts/reconstruction/reaction_mass_balance.py
runscripts/reconstruction/update_proteins_location.py
setup.py
user/MultiprocessingTest.py
user/add_to_test_tablereader_writer.py
user/argparse-trials.py
user/eval_comparison.py
user/mp_test.py
validation/ecoli/validation_data_raw.py
wholecell/analysis/analysis_tools.py
wholecell/analysis/plotting_tools.py
wholecell/fireworks/firetasks/initRawData.py
wholecell/fireworks/firetasks/initRawValidationData.py
wholecell/fireworks/firetasks/initValidationData.py
wholecell/fireworks/firetasks/simulation.py
wholecell/fireworks/firetasks/simulationDaughter.py
wholecell/fireworks/firetasks/symlink.py
wholecell/fireworks/initialize.py
wholecell/listeners/listener.py
wholecell/states/environment.py
wholecell/tests/utils/profile_polymerize.py
wholecell/tests/utils/test_library_performance.py
wholecell/tests/utils/test_polymerize.py
wholecell/tests/utils/test_unit_struct_array.py
wholecell/utils/config.py
wholecell/utils/constants.py
wholecell/utils/enzymeKinetics.py
wholecell/utils/fitting.py
wholecell/utils/forkedPdb.py
wholecell/utils/parallelization.py
wholecell/utils/profiler.py
wholecell/utils/sparkline.py
wholecell/utils/unit_struct_array.py
wholecell/utils/units.py
wholecell/utils/write_ode_file.py