Source code for topo.misc.genexamples

"""
Commands for running the examples files in various ways.

Like a Makefile: contains a list of targets (and groups of targets)
that specify various commands to run.

E.g.

  topographica -c 'from topo.misc.genexamples import generate; generate(targets=["all_quick","saved_examples"])'

Runs the 'all_quick' target if called without any arguments:

  topographica -c 'from topo.misc.genexamples import generate; generate()'

To add new single targets, add to the targets dictionary;
for groups of targets, add to the group_targets dictionary.
"""


# JABALERT: Should be cut down and simplified; most of what it does is
# for historical rather than functional reasons.  E.g. the quick
# options should be in the tests, rather than here, and then the other
# options need not specify how long they should be run; instead that
# should be set by a parameter in the .ty file and then respected by
# this file.  The .ty file could also specify a set of default
# analysis functions to run, e.g. selecting from some options to be
# made available in topo.command, and if so this file need not have any
# handling for specific scripts.  Meanwhile, at least it works.

# Note: has none of the Makefile's dependency processing, so just does
# what you tell it (i.e. over-writes existing files).

import sys
import os.path

from os import system

import param
from param import ParamOverrides

### Convenience functions
[docs]def snapshot(filename): """Return a command for saving a snapshot named filename.""" return "from topo.command import save_snapshot ; save_snapshot('%s')"%filename
[docs]def or_analysis(): """Return a command for orientation analysis.""" return """\ from featuremapper.command import measure_or_pref ; \ from topo.command.analysis import measure_cog ; \ measure_or_pref(); \ measure_cog()"""
[docs]def retinotopy_analysis(): """Return a command for retinotopy analysis.""" return """\ from featuremapper.command import measure_position_pref ; \ from topo.command.analysis import measure_cog ; \ measure_position_pref(); \ measure_cog()""" ###
[docs]def run(examples,script_name,density=None,commands=["topo.sim.run(1)"]): """ Return a complete command for running the given topographica example script (i.e. a script in the examples/ directory) at the given density, along with any additional commands. """ if density: density_cmd = ' -c "default_density='+`density`+'" ' else: density_cmd = " " cmds = "" for c in commands: cmds+=' -c "'+c+'"' topographica = sys.argv[0] script = os.path.join(examples,script_name) return topographica+density_cmd+script+' '+cmds
scripts = { 'hierarchical':'hierarchical.ty', 'lissom_or' :'lissom_or.ty', 'lissom_oo_or':'lissom_oo_or.ty', 'som_retinotopy':'som_retinotopy.ty', 'trickysyntax':'hierarchical.ty', 'obermayer_pnas90':'obermayer_pnas90.ty', 'lissom_fsa':'lissom_fsa.ty', 'gcal':'gcal.ty', 'lissom_oo_or_10000.typ':'lissom_oo_or.ty', 'lissom_fsa_10000.typ':'obermayer_pnas90.ty', 'obermayer_pnas90_40000.typ':'obermayer_pnas90.ty', 'som_retinotopy_40000.typ':'som_retinotopy.ty', 'gcal_10000.typ':'gcal.ty'} def copy_examples(): # topographica -c "from topo.misc.genexamples import copy_examples; copy_examples()" examples = find_examples() locn = os.path.join(param.normalize_path.prefix,"examples") if os.path.exists(locn): print "%s already exists; delete or rename it if you want to re-copy the examples."%locn return else: print "Creating %s"%locn import shutil print "Copying %s to %s"%(examples,locn) shutil.copytree(examples,locn) def print_examples_dir(**kw): examples = find_examples(**kw) if examples: print "Found examples in %s"%examples def find_examples(specified_examples=None,dirs=None): import topo if not specified_examples: # CEBALERT: hack! specified_examples = ["hierarchical","som_retinotopy"] if not dirs: # CEBALERT: is there any significance to the order? E.g. if I have ~/Documents/Topographica/examples # from an installation, will my development copy in ~/topographica-git still find its examples in # ~/topographica-git/examples ? candidate_example_dirs = [ # CEBALERT: ~/topographica/examples is out of date. I just # added the line below without testing it or removing the # ~/topographica line. param.normalize_path.prefix, os.path.join(os.path.expanduser("~"),'topographica/examples'), # version-controlled topographica dir os.path.join(topo._package_path,"../examples"), # debian package os.path.join(topo._package_path,"../../../share/topographica/examples"), # setup.py package os.path.join(topo._package_path,"../../../../../share/topographica/examples"), os.path.join(topo._package_path,"../../../../share/topographica/examples"), # egg os.path.join(topo._package_path,"../share/topographica/examples"), # expected bdist_mpkg location... "/usr/local/share/topographica/examples", # ...but actually this; not sure why "/usr/local/share/share/topographica/examples"] else: candidate_example_dirs = dirs ced = [os.path.normpath(d) for d in candidate_example_dirs] candidate_example_dirs = ced # CEBALERT: horrible way to find directory that contains all the # examples specified. examples = None for d in candidate_example_dirs: if not examples: for cmd in specified_examples: if os.path.isfile(os.path.join(d,scripts[cmd])): examples = d else: examples = False if examples is False: break return examples # CEBALERT: should be rewritten! def _stuff(specified_targets): # shortcuts for executing multiple targets group_targets = dict( all_quick=["hierarchical","som_retinotopy","lissom_oo_or"], all_long=["lissom_oo_or_10000.typ","som_retinotopy_40000.typ", "lissom_or_10000.typ","lissom_fsa_10000.typ"], saved_examples=["lissom_oo_or_10000.typ"]) ### Create the list of commands to execute either by getting the ### command labels from a target, or by inserting the command label # CB: I don't know any string methods; I'm sure this can # be simplified! command_labels=[] for a in specified_targets: if a in group_targets: command_labels+=group_targets[a] else: command_labels.append(a) examples = find_examples(specified_examples=command_labels) if not examples: raise IOError("Could not find examples.") else: print "Found examples in %s"%examples # CB: so much repeated typing... available_targets = { "hierarchical": run(examples,scripts["hierarchical"],density=4), "lissom_or": run(examples,scripts["lissom_or"],density=4), "lissom_oo_or": run(examples,scripts["lissom_oo_or"],density=4), "som_retinotopy": run(examples,scripts["som_retinotopy"],density=4), "trickysyntax":run(examples,scripts["hierarchical"],commands=["topo.sim.run(1)", "print 'printing a string'"]), "lissom_oo_or_10000.typ":run(examples,scripts["lissom_oo_or"], commands=["from topo.misc.ipython import RunProgress", "RunProgress(label=None)(10000)", or_analysis(), snapshot("lissom_oo_or_10000.typ")]), "lissom_or_10000.typ":run(examples,scripts["lissom_or"], commands=["from topo.misc.ipython import RunProgress", "RunProgress(label=None)(10000)", or_analysis(), snapshot("lissom_or_10000.typ")]), "lissom_fsa_10000.typ":run(examples,scripts["lissom_fsa"], commands=["from topo.misc.ipython import RunProgress", "RunProgress(label=None)(10000)", snapshot("lissom_fsa_10000.typ")]), "obermayer_pnas90_40000.typ":run(examples,scripts["obermayer_pnas90"], commands=["from topo.misc.ipython import RunProgress", "RunProgress(label=None)(40000)", or_analysis(), snapshot("obermayer_pnas90_30000.typ")]), "som_retinotopy_40000.typ":run(examples,scripts["som_retinotopy"], commands=["from topo.misc.ipython import RunProgress", "RunProgress(label=None)(40000)", retinotopy_analysis(), snapshot("som_retinotopy_40000.typ")]), "gcal_10000.typ":run(examples,scripts["gcal"], commands=["from topo.misc.ipython import RunProgress", "RunProgress(label=None)(10000)", or_analysis(), snapshot("gcal_10000.typ")]) } return command_labels,available_targets class generate(param.ParameterizedFunction): targets = param.List(default=['all_quick']) def __call__(self,**params): p = ParamOverrides(self,params) command_labels,available_targets = _stuff(p.targets) for cmd in command_labels: c = available_targets[cmd] print c system(c)