Source code for qcdb.psiutil

#
#@BEGIN LICENSE
#
# PSI4: an ab initio quantum chemistry software package
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
#@END LICENSE
#

r"""Stuff stolen from psi. Should import or not as necessary
or some better way. Apologies to the coders.

"""
import sys
import math
import re
from vecutil import *


def _success(label):
    """Function to print a '*label*...PASSED' line to screen.
    Used by :py:func:`util.compare_values` family when functions pass.

    """
    print('\t{0:.<66}PASSED'.format(label))
    sys.stdout.flush()


[docs]def compare_values(expected, computed, digits, label): """Function to compare two values. Prints :py:func:`util.success` when value *computed* matches value *expected* to number of *digits*. Performs a system exit on failure. Used in input files in the test suite. """ if abs(expected - computed) > 10 ** (-digits): print("\t%s: computed value (%f) does not match (%f) to %d digits." % (label, computed, expected, digits)) sys.exit(1) if math.isnan(computed): print("\t%s: computed value (%f) does not match (%f) to %d digits.\n" % (label, computed, expected, digits)) print("\tprobably because the computed value is nan.") sys.exit(1) _success(label)
[docs]def compare_matrices(expected, computed, digits, label): """Function to compare two matrices. Prints :py:func:`util.success` when elements of matrix *computed* match elements of matrix *expected* to number of *digits*. Performs a system exit on failure to match symmetry structure, dimensions, or element values. Used in input files in the test suite. """ rows = len(expected) cols = len(expected[0]) failed = 0 for row in range(rows): for col in range(cols): if abs(expected[row][col] - computed[row][col]) > 10 ** (-digits): print("\t%s: computed value (%s) does not match (%s)." % (label, expected[row][col], computed[row][col])) failed = 1 break if failed: print("The Failed Test Matrices\n") show(computed) print('\n') show(expected) sys.exit(1) _success(label)
[docs]def query_yes_no(question, default=True): """Ask a yes/no question via raw_input() and return their answer. *question* is a string that is presented to the user. *default* is the presumed answer if the user just hits <Enter>. It must be yes (the default), no or None (meaning an answer is required of the user). The return value is one of True or False. """ yes = re.compile(r'^(y|yes|true|on|1)', re.IGNORECASE) no = re.compile(r'^(n|no|false|off|0)', re.IGNORECASE) if default == None: prompt = " [y/n] " elif default == True: prompt = " [Y/n] " elif default == False: prompt = " [y/N] " else: raise ValueError("invalid default answer: '%s'" % default) while True: sys.stdout.write(question + prompt) choice = raw_input().strip().lower() if default is not None and choice == "": return default elif yes.match(choice): return True elif no.match(choice): return False else: sys.stdout.write(" Please respond with 'yes' or 'no'.\n")