# The LearningOnline Network with CAPA - LON-CAPA # CalcEnv # # $Id: CalcEnv.pm,v 1.3 2023/03/13 22:31:22 raeburn Exp $ # # Copyright (C) 2014 Michigan State University Board of Trustees # # 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 3 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, see . # ## # Calculation environment, using either units or variables. ## package Apache::math_parser::CalcEnv; use strict; use warnings; use utf8; use File::Slurp; use aliased 'Apache::math_parser::Quantity'; use aliased 'Apache::math_parser::Units'; ## # Constructor # @param {boolean} unit_mode ## sub new { my ($class, $unit_mode) = @_; if (!defined $unit_mode) { $unit_mode = 0; } my $self = { _unit_mode => $unit_mode, }; if ($self->{_unit_mode}) { $self->{_units} = Units->new(); } else { $self->{_variables} = { }; # hash variable name -> quantity } my $constants_txt = read_file("$Apache::lonnet::perlvar{'lonTabDir'}/constants.json"); $self->{_constants} = JSON::DWIW->new->from_json($constants_txt); $self->{_tolerance} = 0; bless $self, $class; return $self; } # Attribute helpers ## # Unit mode ? # @returns {boolean} ## sub unit_mode { my $self = shift; return $self->{_unit_mode}; } ## # Units # @returns {Units} ## sub units { my $self = shift; return $self->{_units}; } ## # Variables # @returns {Object.} hash variable name -> quantity ## sub variables { my $self = shift; return $self->{_variables}; } ## # The constants, read from constants.json. # @returns {hash} A hash name -> hash with the keys value and units ## sub constants { my $self = shift; return $self->{_constants}; } ## # Tolerance # @returns {string|float} tolerance ## sub tolerance { my $self = shift; return $self->{_tolerance}; } ## # Changes an existing unit or defines a new one. # @param {string} symbol - name used in math expressions # @param {string} convert - SI equivalent or using other units to help converting to SI ## sub setUnit { my( $self, $symbol, $convert ) = @_; $self->units->{_derived}->{$symbol} = $convert; } ## # Changes an existing variable value or defines a new one. # @param {string} symbol - name used in math expressions # @param {float|Quantity} value - number value or Quantity ## sub setVariable { my( $self, $symbol, $value ) = @_; if ($value->isa(Quantity)) { $self->variables->{$symbol} = $value; } else { $self->variables->{$symbol} = Quantity->new($value); } } ## # Defines the tolerance to use for = operations. # @param {string|float} tolerance ## sub setTolerance { my( $self, $tolerance ) = @_; $self->{_tolerance} = $tolerance; } ## # Returns a variable quantity or undef. # @param {string} symbol - name used in math expressions # @returns {Quantity} ## sub getVariable { my( $self, $symbol ) = @_; return $self->variables->{$symbol}; } ## # Returns a constant quantity or undef. # @param {string} symbol - name used in math expressions # @returns {Quantity} ## sub getConstant { my( $self, $symbol ) = @_; my $cst = $self->constants->{$symbol}; if (!defined $cst) { return undef; } return Quantity->new($cst->{"value"}, $cst->{"units"}); } ## # Converts a unit name into a Quantity. Throws an exception if the unit is not known. # @param {string} name - the unit name # @returns {Quantity} ## sub convertToSI { my ( $self, $name ) = @_; return $self->units->convertToSI($self, $name); } 1; __END__