Annotation of loncom/homework/math_parser/CalcEnv.pm, revision 1.1

1.1     ! damieng     1: # The LearningOnline Network with CAPA - LON-CAPA
        !             2: # CalcEnv
        !             3: #
        !             4: # Copyright (C) 2014 Michigan State University Board of Trustees
        !             5: #
        !             6: # This program is free software: you can redistribute it and/or modify
        !             7: # it under the terms of the GNU General Public License as published by
        !             8: # the Free Software Foundation, either version 3 of the License, or
        !             9: # (at your option) any later version.
        !            10: #
        !            11: # This program is distributed in the hope that it will be useful,
        !            12: # but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
        !            14: # GNU General Public License for more details.
        !            15: #
        !            16: # You should have received a copy of the GNU General Public License
        !            17: # along with this program. If not, see <http://www.gnu.org/licenses/>.
        !            18: #
        !            19: 
        !            20: ##
        !            21: # Calculation environment, using either units or variables.
        !            22: ##
        !            23: package Apache::math_parser::CalcEnv;
        !            24: 
        !            25: use strict;
        !            26: use warnings;
        !            27: use utf8;
        !            28: 
        !            29: use File::Slurp;
        !            30: 
        !            31: use aliased 'Apache::math_parser::Quantity';
        !            32: use aliased 'Apache::math_parser::Units';
        !            33: 
        !            34: ##
        !            35: # Constructor
        !            36: # @param {boolean} unit_mode
        !            37: ##
        !            38: sub new {
        !            39:     my $class = shift;
        !            40:     my $self = {
        !            41:         _unit_mode => shift // 0,
        !            42:     };
        !            43:     if ($self->{_unit_mode}) {
        !            44:         $self->{_units} = Units->new();
        !            45:     } else {
        !            46:         $self->{_variables} = { }; # hash variable name -> quantity
        !            47:     }
        !            48:     my $constants_txt = read_file("$Apache::lonnet::perlvar{'lonTabDir'}/constants.json");
        !            49:     $self->{_constants} = JSON::DWIW->new->from_json($constants_txt);
        !            50:     $self->{_tolerance} = 0;
        !            51:     bless $self, $class;
        !            52:     return $self;
        !            53: }
        !            54: 
        !            55: # Attribute helpers
        !            56: 
        !            57: ##
        !            58: # Unit mode ?
        !            59: # @returns {boolean}
        !            60: ##
        !            61: sub unit_mode {
        !            62:     my $self = shift;
        !            63:     return $self->{_unit_mode};
        !            64: }
        !            65: 
        !            66: ##
        !            67: # Units
        !            68: # @returns {Units}
        !            69: ##
        !            70: sub units {
        !            71:     my $self = shift;
        !            72:     return $self->{_units};
        !            73: }
        !            74: 
        !            75: ##
        !            76: # Variables
        !            77: # @returns {Object.<string, Quantity>} hash variable name -> quantity
        !            78: ##
        !            79: sub variables {
        !            80:     my $self = shift;
        !            81:     return $self->{_variables};
        !            82: }
        !            83: 
        !            84: ##
        !            85: # The constants, read from constants.json.
        !            86: # @returns {hash} A hash name -> hash with the keys value and units
        !            87: ##
        !            88: sub constants {
        !            89:     my $self = shift;
        !            90:     return $self->{_constants};
        !            91: }
        !            92: 
        !            93: ##
        !            94: # Tolerance
        !            95: # @returns {string|float} tolerance
        !            96: ##
        !            97: sub tolerance {
        !            98:     my $self = shift;
        !            99:     return $self->{_tolerance};
        !           100: }
        !           101: 
        !           102: 
        !           103: ##
        !           104: # Changes an existing unit or defines a new one.
        !           105: # @param {string} symbol - name used in math expressions
        !           106: # @param {string} convert - SI equivalent or using other units to help converting to SI
        !           107: ##
        !           108: sub setUnit {
        !           109:     my( $self, $symbol, $convert ) = @_;
        !           110:     $self->units->{_derived}->{$symbol} = $convert;
        !           111: }
        !           112: 
        !           113: ##
        !           114: # Changes an existing variable value or defines a new one.
        !           115: # @param {string} symbol - name used in math expressions
        !           116: # @param {float|Quantity} value - number value or Quantity
        !           117: ##
        !           118: sub setVariable {
        !           119:     my( $self, $symbol, $value ) = @_;
        !           120:     if ($value->isa(Quantity)) {
        !           121:         $self->variables->{$symbol} = $value;
        !           122:     } else {
        !           123:         $self->variables->{$symbol} = Quantity->new($value);
        !           124:     }
        !           125: }
        !           126: 
        !           127: ##
        !           128: # Defines the tolerance to use for = operations.
        !           129: # @param {string|float} tolerance
        !           130: ##
        !           131: sub setTolerance {
        !           132:     my( $self, $tolerance ) = @_;
        !           133:     $self->{_tolerance} = $tolerance;
        !           134: }
        !           135: 
        !           136: ##
        !           137: # Returns a variable quantity or undef.
        !           138: # @param {string} symbol - name used in math expressions
        !           139: # @returns {Quantity}
        !           140: ##
        !           141: sub getVariable {
        !           142:     my( $self, $symbol ) = @_;
        !           143:     return $self->variables->{$symbol};
        !           144: }
        !           145: 
        !           146: ##
        !           147: # Returns a constant quantity or undef.
        !           148: # @param {string} symbol - name used in math expressions
        !           149: # @returns {Quantity}
        !           150: ##
        !           151: sub getConstant {
        !           152:     my( $self, $symbol ) = @_;
        !           153:     my $cst = $self->constants->{$symbol};
        !           154:     if (!defined $cst) {
        !           155:         return undef;
        !           156:     }
        !           157:     return Quantity->new($cst->{"value"}, $cst->{"units"});
        !           158: }
        !           159: 
        !           160: ##
        !           161: # Converts a unit name into a Quantity. Throws an exception if the unit is not known.
        !           162: # @param {string} name - the unit name
        !           163: # @returns {Quantity}
        !           164: ##
        !           165: sub convertToSI {
        !           166:     my ( $self, $name ) = @_;
        !           167:     return $self->units->convertToSI($self, $name);
        !           168: }
        !           169: 
        !           170: 
        !           171: 1;
        !           172: __END__

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>